0

在我的程序中,我在运行时使用 LoadLibrary 加载了一个 dll。在发布模式下运行时,一切正常。

但是当我尝试在调试模式下运行程序时,加载库以 SIGILL 停止,调试器显示它在 sti 指令上停止。

我还尝试通过从 dll 直接调用在程序加载期间链接 dll。但是我在程序加载期间得到了 SIGILL 。

我正在使用带有 qt5 的 mingw48。我对调试那个 dll 不感兴趣,只是为了调试另一个自己编写的代码部分。

到目前为止,我发现 sti/cli 指令仅在特权代码中。据我了解,在 gdb 中运行的代码没有特权。

我已经尝试过忽略信号::signal(SIGILL, SIG_IGN);

Gdb 命令handle SIGILL pass nostop noprint在这里有帮助,但我想知道我的程序 SIGILLs 是否在其他地方

我真正需要的是在调试其余程序时以某种非调试模式加载该库。

4

1 回答 1

1

似乎图书馆本身处理了 SIGILL,但 GDB 在图书馆有机会解决它之前就抓住了它。我认为没有比处理 SIGILL pass nostop noprint 更好的选择了。唯一的提示是使用创建本地 .gdbinit 文件,这样调试会话就不会停止。对于 qt 它是:

CONFIG( debug, debug|release ) {
QT_OUTDIR = $$OUT_PWD/debug
gdbinitfile.target = $$QT_OUTDIR/.gdbinit
gdbinitfile.commands = echo handle SIGILL pass nostop noprint > $$gdbinitfile.target
}
于 2013-09-04T09:05:14.417 回答