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

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

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

我正在使用mingw48附带的机智qt5。
我对调试该dll不感兴趣,仅对调试其他自己编写的代码部分感兴趣。

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

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

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

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

最佳答案

似乎库本身可以处理SIGILL,但是GDB在库有机会解决它之前就对其进行了捕获。
我认为没有比处理SIGILL pass nostop noprint更好的选择了。
唯一的提示是使用create local .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
}

关于c - 在gdb上,加载库满足sti指令并发出SIGILL信号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18122776/

10-09 06:26