我希望能够在GDB中设置一个断点,让它运行到那一点 - 并在此过程中,打印出已经"逐步完成"的行.
这是一个例子,基于这个带有a main
和a函数的简单文件,每个都有两个断点:
$ cat > test.c <<EOF
#include "stdio.h"
int count=0;
void doFunction(void) {
// two steps forward
count += 2;
// one step back
count--;
}
int main(void) {
// some pointless init commands;
count = 1;
count += 2;
count = 0;
//main loop
while(1) {
doFunction();
printf("%d\n", count);
}
}
EOF
$ gcc -g -Wall test.c -o test.exe
$ chmod +x test.exe
$ gdb -se test.exe
...
Reading symbols from /path/to/test.exe...done.
(gdb) b …
Run Code Online (Sandbox Code Playgroud) 我正在编译一个C++库,它定义了一个从一组数据点中随机采样的函数.数据点存储在a中std::vector
.有126,272个std::vector
push_back语句,其中有问题的向量是类型double
.编译需要很长时间.
为什么这需要这么久?(除了std::vector
push_back语句之外的所有代码都需要不到1秒的时间来编译,因为其他代码很少.)
如何调用感兴趣的gdb打印函数,根据堆栈的深度缩进?
我希望能够说出(制作):
(gdb) trace Foo* Bar* printf
Run Code Online (Sandbox Code Playgroud)
并让gdb打印所有以Foo或Bar开头的函数,因为它们被调用.有点像gnu cflow,除了使用调试符号和仅实际调用的打印函数,而不是所有可能的调用流.
无法帮助的工具包括cachegrind,callgrind和oprofile,它们最常调用函数的结果.我需要保留的调用顺序.
通配符(或等效的)是必不可少的,因为有很多Foo和Bar函数.虽然我愿意完全记录所有功能.或者,也许告诉gdb记录特定库中的所有函数.
某些GDB向导必须有一个用于此常见作业的脚本!
我想知道我们是否可以在任何C或C++应用程序中启用跟踪.
例如,使用gcc选项或小工具,我将启用跟踪,并在控制台上打印跟踪或转储到文件.
由于有很多文件和函数/类,我不想手动开始添加跟踪打印.
如果此类工具不可用,则下一步选择使用脚本并尝试在跟踪打印时添加.
strace
没有多大用处,因为它主要给出了系统调用.
我正试图通过llvm的opt程序(用于作业),并且教师建议设置一个断点runOnFunction
.我在其中一个文件中看到了这个:
bool InstCombiner::runOnFunction(Function &F) { /* (Code removed for SO) */ }
Run Code Online (Sandbox Code Playgroud)
但是gdb似乎没有找到runOnFunction
断点.我突然想到问题可能是命名空间?我试过这个,但gdb永远不会中断,它只是创建了fooOpt.s文件:
(gdb) b runOnFunction
Function "runOnFunction" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (runOnFunction) pending.
(gdb) r -S -instcombine -debug -o ~/Desktop/fooOpt.s ~/Desktop/foo.s
Run Code Online (Sandbox Code Playgroud)
我在Mac上,所以我没有objdump
,但otool
生产560万线,通过涉水起点似乎没有合理的runOnFunction多次出现有更多的.
有时在GDB中,我想查看将程序移到现在的控制流。简而言之,如何使GDB打印最后执行的x行?
c ×4
gdb ×4
debugging ×3
c++ ×2
automation ×1
call-graph ×1
compilation ×1
control-flow ×1
dynamic ×1
gcc ×1
llvm ×1
namespaces ×1
stdvector ×1
trace ×1