【发布时间】:2012-03-29 02:49:24
【问题描述】:
是否可以在编译之前在 C 文件中添加 GDB 断点?目前,我必须在通过 GDB 编译后指定断点。
我正在寻找类似于 JavaScript 的 debugger; 语句的东西。
【问题讨论】:
是否可以在编译之前在 C 文件中添加 GDB 断点?目前,我必须在通过 GDB 编译后指定断点。
我正在寻找类似于 JavaScript 的 debugger; 语句的东西。
【问题讨论】:
在 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 的行号和文件,并在找到它们的每个文件的每一行设置一个断点,然后开始数据库
【讨论】:
不是这样,但您可以插入一些有用的函数调用:
一种选择是创建一个函数:
void break_here ()
{
/* do nothing */
}
然后在任何你想要的地方调用它,但要小心它不会被内联(把它放在不同的文件中,或者添加一个“noinline”属性)。
然后,在 GDB 中,只需在 break_here 上设置一个断点,就完成了。如果您觉得每次都设置断点很繁琐,您可以在您的主目录或包含断点命令的当前工作目录中创建一个名为 .gdbinit 的文件。
另一个适用于 Linux 的选项是使用信号:
raise (SIGUSR1);
您可以使用任何您喜欢的信号,但最好使用不会杀死您的程序的信号(尽管您可以将 GDB 配置为不将它们传递给您的程序,如果您愿意的话)。
【讨论】:
$HOME 变量作为主目录的位置。
void break_here ( void ) __attribute__ ((optimize(0)));。仅使用 __attrubute__((noinline)) 不会阻止 GCC 完全优化调用。或者,此行将关闭源文件其余部分的优化:#pragma GCC optimize("0"),如果您想在其他优化的构建中调试一个模块,这很有用。
我不知道直接设置断点的方法,但 GDB 会捕获中断,所以这是一种可能的解决方案。
这样的事情应该可以工作。您需要包含 signal.h:
raise(SIGABRT);
【讨论】: