【问题标题】:Set GDB breakpoint in C file在 C 文件中设置 GDB 断点
【发布时间】:2012-03-29 02:49:24
【问题描述】:

是否可以在编译之前在 C 文件中添加 GDB 断点?目前,我必须在通过 GDB 编译后指定断点。

我正在寻找类似于 JavaScript 的 debugger; 语句的东西。

【问题讨论】:

    标签: c gdb


    【解决方案1】:

    在 linux 上,我假设你正在使用 gdb,你可以编写一个脚本来使用代码中的 cmets 来完成它

    #!/bin/bash
    #debug: Script to run programs in gdb with comments to specify break 
    points
    echo "file ./a.out" > run
    grep -nrIH "/\*GDB\*/" |
        sed "s/\(^[^:]\+:[^:]\+\):.*$/\1/g" |
        awk '{print "b" " " $1 }'|
        grep -v $(echo $0| sed "s/.*\///g") >> run
    gdb --init-command ./run -ex=r
    exit 0
    

    然后在需要断点的地方,只需添加/*GDB*/,脚本将使用 grep 查找包含这些 cmets 的行号和文件,并在找到它们的每个文件的每一行设置一个断点,然后开始数据库

    【讨论】:

      【解决方案2】:

      不是这样,但您可以插入一些有用的函数调用:

      一种选择是创建一个函数:

      void break_here ()
      {
        /* do nothing */
      }
      

      然后在任何你想要的地方调用它,但要小心它不会被内联(把它放在不同的文件中,或者添加一个“noinline”属性)。

      然后,在 GDB 中,只需在 break_here 上设置一个断点,就完成了。如果您觉得每次都设置断点很繁琐,您可以在您的主目录或包含断点命令的当前工作目录中创建一个名为 .gdbinit 的文件。

      另一个适用于 Linux 的选项是使用信号:

      raise (SIGUSR1);
      

      您可以使用任何您喜欢的信号,但最好使用不会杀死您的程序的信号(尽管您可以将 GDB 配置为不将它们传递给您的程序,如果您愿意的话)。

      【讨论】:

      • 完全一样,我想,虽然我隐约记得 Windows 有不同的文件名? GDB 使用您的 $HOME 变量作为主目录的位置。
      • 啊,刚刚查了一下:Windows可能使用gdb.ini作为文件名,但里面只是一个GDB脚本。
      • 像这样声明函数:void break_here ( void ) __attribute__ ((optimize(0)));。仅使用 __attrubute__((noinline)) 不会阻止 GCC 完全优化调用。或者,此行将关闭源文件其余部分的优化:#pragma GCC optimize("0"),如果您想在其他优化的构建中调试一个模块,这很有用。
      【解决方案3】:

      我不知道直接设置断点的方法,但 GDB 会捕获中断,所以这是一种可能的解决方案。

      这样的事情应该可以工作。您需要包含 signal.h:

      raise(SIGABRT);
      

      【讨论】:

        猜你喜欢
        • 2012-08-10
        • 2014-09-22
        • 2010-12-01
        • 2015-09-22
        • 1970-01-01
        • 1970-01-01
        • 2018-12-15
        • 1970-01-01
        相关资源
        最近更新 更多