gdb的bt
时间: 2023-08-01 19:06:24 浏览: 71
gdb的 `bt` 命令可以打印出当前函数的调用栈信息,它的全称是 `backtrace`。它可以帮助我们定位程序崩溃的位置,以及找出调用某个函数的路径。一般来说,我们使用 `gdb` 进行程序调试时,当程序出现异常或者崩溃时,都需要使用 `bt` 命令来查看调用栈信息。
使用方法:
1. 在程序崩溃后,使用 `gdb` 命令进入调试模式。
2. 运行程序,让其崩溃。
3. 在 `gdb` 命令行输入 `bt`,即可打印出当前函数的调用栈信息。
示例:
假设我们有一个简单的 C++ 程序 `test.cpp`,其中有两个函数 `foo()` 和 `bar()`,`bar()` 函数调用了 `foo()` 函数,并且程序在 `foo()` 函数内崩溃了。我们可以使用 `gdb` 来查看调用栈信息,以便定位崩溃位置:
```
#include <iostream>
void foo() {
int* p = nullptr;
*p = 0; // 崩溃点
}
void bar() {
foo();
}
int main() {
bar();
return 0;
}
```
编译命令:`g++ -g -o test test.cpp`
进入 `gdb` 调试模式:`gdb test`
运行程序:`run`
程序崩溃后,在 `gdb` 命令行输入 `bt`,可以得到如下输出:
```
Program received signal SIGSEGV, Segmentation fault.
0x00005555555546ef in foo () at test.cpp:5
5 *p = 0; // 崩溃点
(gdb) bt
#0 0x00005555555546ef in foo () at test.cpp:5
#1 0x0000555555554701 in bar () at test.cpp:10
#2 0x0000555555554718 in main () at test.cpp:15
```
可以看到,程序崩溃在 `foo()` 函数的第 5 行,而 `foo()` 函数被 `bar()` 函数调用,`bar()` 函数被 `main()` 函数调用。因此,我们可以确定崩溃位置在 `foo()` 函数内,并且调用路径为 `main() -> bar() -> foo()`。