GDB Backtrace
项目测试时,hs公司回传用的调试界面是gdb bt的测试页面,看着相当高级,记录下使用方式
参考:How to Use GDB Backtrace to Debug Strack Frame using C Example Code
首先,编译使用的指令为gdb [filename.c] -o [object name] -ggdb
,这样才能够编译成能够调试的文件objectname。不然会出现No symbol table is loaded.
的问题。How fix the “No symbol table is loaded.” gdb issue on Mountain Lion
bt指令参考表
调试指令 | 作 用 |
---|---|
(gdb) break xxx | |
(gdb) b xxx | 在源代码指定的某一行设置断点,其中 xxx 用于指定具体打断点的位置。 |
(gdb) run | |
(gdb) r | 执行被调试的程序,其会自动在第一个断点处暂停执行。 |
(gdb) continue | |
(gdb) c | 当程序在某一断点处停止运行后,使用该指令可以继续执行,直至遇到下一个断点或者程序结束。 |
(gdb) next | |
(gdb) n | 令程序一行代码一行代码的执行。 |
(gdb) print xxx | |
(gdb) p xxx | 打印指定变量的值,其中 xxx 指的就是某一变量名。 |
(gdb) list | |
(gdb) l | 显示源程序代码的内容,包括各行代码所在的行号。 |
(gdb) quit | |
(gdb) q | 终止调试。 |
参考
GDB调试C/C++程序
gdb调试常用命令,attach,br,n,bt
示例
代码
#include <malloc.h>
#include <stdio.h>
void fun1();
void fun2();
void fun3();
void fun1()
{
int i = 10;
fun2();
printf("fun1");
}
void fun2()
{
int i = 20;
fun3();
printf("fun2");
}
void fun3()
{
int i = 30;
printf("fun3");
}
int main()
{
int i = 0;
fun1();
}
控制台指令
gdb objectname #进入调试
b 18 #在18行添加断点
l #显示代码行号
run #开始运行
n 2 #运行2行
s 2 #跳过2行
(gdb) q #跳出gdb调试
A debugging session is active.
Inferior 1 [process 1796] will be killed.
Quit anyway? (y or n) y
(gdb) p i #显示i的当前值
$3 = 20
(gdb) bt #查看当前堆栈
#0 fun2 () at test4.c:20
#1 0x0000555555555166 in fun1 () at test4.c:12
#2 0x00005555555551ef in main () at test4.c:32
其中bt(Backtrace)指令用于查看堆栈,显示的值#x,x越小越接近当前运行位置,即#0是当前的函数的位置。