【问题标题】:on gdb, LoadLibrary mets sti instruciton and singals SIGILL在 gdb 上,加载库遇到 sti 指令并发出 SIGILL 信号
【发布时间】:2013-08-09 23:22:45
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: c winapi dll gdb mingw


    【解决方案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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-08
      • 1970-01-01
      • 2013-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-28
      • 2017-11-21
      相关资源
      最近更新 更多