2012-03-12 162 views
3

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

我正在寻找类似于JavaScript的debugger;声明的内容。

回答

4

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

一种选择是创建一个功能:

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

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

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

在Linux上工作的另一种方法是使用一个信号:

raise (SIGUSR1); 

你可以使用任何你喜欢的信号,但最好使用一个不杀你的程序(虽然你可以配置GDB如果你愿意,不要将它们传递给你的程序)。

+0

谢谢!你知道'.gdbinit'如何与Cygwin一起工作吗? – Randomblue 2012-03-12 17:27:08

+0

完全一样,我想,虽然我依稀记得Windows有不同的文件名? GDB使用你的'$ HOME'变量作为主目录的位置。 – ams 2012-03-12 17:30:20

+0

啊,只是查了一下:Windows *可能会使用gdb.ini作为文件名,但它只是一个GDB脚本。 – ams 2012-03-12 17:31:43

2

我没有意识到直接设置断点的方法,但GDB会捕获中断,所以这是一种可能的解决方案。

这样的事情应该工作。你需要包括signal.h中:

raise(SIGABRT); 
0

在Linux上,这我假设你在,因为你用gdb你可以做一个脚本,无论你需要一个断点与意见做代码

#!/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查找带有这些注释的行号和文件,并在每个找到它们的文件的每一行上设置一个断点,然后启动gdb