首页 文章

如何有条件地忽略GDB中的SIGTRAP?

提问于
浏览
2

我正在尝试调试在特定例程中触发不需要的SIGTRAP的程序 . 此信号在库中触发,但同一调用者始终显示在回溯中 . 如果调用者是[某种功能]而不是打破它,我怎么能告诉GDB忽略这个信号呢?

我试过使用 skip function [some function] 甚至 skip file [file that triggers SIGTRAP] (来自5.3 Skipping Over Functions and Files),但是GDB仍然在那条线上破了 . 并且 continue 不会采取任何不需要修改调试程序的解决方案,包括GDB的Python脚本 . 如果相关,您还可以假设在触发SIGTRAP之前将错误写入 stderr .

两年前,有人问我怎样才能让GDB在断点时停在SIGTRAP?这没有得到任何答案,所以我希望问题的弱点(忽略一些特定的SIGTRAP)是可以回答的 .

1 回答

  • 4

    您可以在源(问题的触发器)或事件发生后解决问题(请参阅this answer忽略某些SIGTRAP) . 下面我将解释如何处理第一种情况(避免触发) .

    如果您有以下代码:

    void debug_break() {
        asm("int3");
    }
    

    然后你可以设置一个断点,用命令立即返回:

    break debug_break
    commands
     return
     continue
    end
    

    如果由于代码混合而无法返回:

    /* some code here */
    asm("int3");
    print_error();
    

    然后你可以使用 jump 命令跳过一行 . 假设 int3 行是1337,请使用:

    break file.c:1337
    commands
     j +1
     c
    end
    

    如果东西在一行上( asm("int3"); print_error(); ,则更改行跳转以递增程序计数器( set $pc++ ) . 这假定指令是一个字节 .

相关问题