CC BY 4.0 (除特别声明或转载文章外)
如果这篇博客帮助到你,可以请我喝一杯咖啡~
一、-g
使用gdb调试,编译命令中要加入-g将调试信息加入可执行文件中
g++ -g -o A A.cpp
then $gdb\text{ A} $进入调试.
二、调试步骤(简单调试命令)
-
run
简写r,运行程序
-
break
简写b,设置断点,run可以停在断点位置,然后可以单步调试。断点可以设置在函数的位置或者某一行。
-
next
简写n,执行下一行,如果某一行为函数,不进入函数里。
-
step
简写s,下一步,会进入函数里取执行。
-
list
简写l,打印代码,默认10行
-
print
简写p ,打印某值
-
display
display j,展示j的值,每次单步调试会显示j的值
-
undisplay
undisplay,display会为变量分配一个id,undisplay id,不再展示变量的值
-
finish
调试函数时,finish可以跳过中间的执行步骤直接执行完函数,并打印最后函数的返回结果。然后停在那里。
-
return
调试函数时,return可以在中间位置直接return expression,跳过执行函数后面的步骤,直接返回表达式。
三、函数相关
-
列出函数的名字
info functions可以列出可执行文件的所有函数名称。
-
是否进入带调试信息的函数
step 进入,next不进入
-
进入不带调试信息的函数
默认情况下,gdb不会进入不带调试信息的函数。set step-mode on命令,这样gdb就不会跳过没有调试信息的函数。
-
退出正在调试的函数
finish or return,参见上述。
-
直接执行函数
call or print命令。
-
打印函数堆栈帧信息
info frame(i frame),i是info命令的缩写。
info registers, 打印寄存器信息。
-
打印尾调用堆栈帧信息
尾调用(Tail Call)是指一个函数在返回时直接调用另一个函数,并且调用的结果直接作为当前函数的返回值。这种调用方式可以通过编译器优化为尾调用优化(Tail Call Optimization, TCO),避免额外的栈帧分配,从而节省内存和提高性能。
-O:优化,类似于O2,O3
g++ -g -O -o tailcall tailcall.cpp
-
选择函数堆栈帧
backtrace:显示到现在位置的堆栈帧信息。
frame id
frame addr
id 选择的堆栈帧id,addr选择的函数堆栈帧地址。
-
向上或向下切换函数堆栈帧
up n
down n
向上或向下选择函数堆栈帧。
up-silently n
down-silently n
n省略则为1,下面的命令与上面的命令相比,切换后不会打印信息。