在我的程序中,我在运行时使用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/