贡献者: addis
g++/gcc 编译时用 -g 选项以用于 debug
r,p,f,s,n,ptype(检查 typename 或者变量的类型)
catch throw 可以在任何异常发生时暂停
gdb <exename>,无需 ./.也可以先进入 gdb 然后用 file <exename>
gdb -w 开启 gdb 自带 gui, 如果存在.强烈推荐 guigdb 项目(见我的相关笔记),可以在浏览器中显示一个 gdb 的 gui,也支持 intel 的 gdb-ia
gdb -tui 或 gdbtui 开启 Text User Interface, 可以同时显示代码,汇编,registers, gdb 命令等等.
quit or q 退出 gdb
catch throw 命令可以在(c++)程序调用 throw 的时候 break
break <line#> (快捷键 b <line#>) 指定主文件的行号设置 breakpoing
break <file>:<line#> 指定文件和行号设置 breakpoing
break <subroutine> 在函数体第一行设置 breakpoing
break <line#> if i == 99
cond 3 i == 99
info breakpoints 显示所有 breakpoint(快捷键 info b)
run or r 运行程序,遇到 breakpoint 为止
< 输入 input 文件,打开 gdb 的时候不能指定 input 文件,而是在 gdb 内使用 run < inputfle.
next(快捷键 n)运行到下一行
step(快捷键 s)进入函数
print <var/expr> (快捷键 p) 来显示某个变量或执行某个命令,只有在没有被优化掉的函数才可以在调试时执行,所以为了使函数可以被执行,可以把函数定义放到单独的 cpp 文件中,而不要用 inline
print 调用的函数不能有默认变量,函数 overload 大部分情况也不行.
print 字符串的时候会打出一堆东西不方便,用 p str.c_str() 和 p str.size() 即可
frame 显示当前的文件,行号,函数,和代码
where 用于询问当前执行到哪里(等效于 backtrace 即 bt)
list(快捷键 l)显示 10 行周围的代码,反复使用可以连续列出下文代码
continue(快捷键 c),继续运行直到遇到 breakpoint
clear 清除当前行的 breakpoint
delete <number> 清除编号为 <number> 的 breakpoint
delete 清除所有 breakpoint
<break#> <times> to ignore the breakpoint <break#> for <times> times
finish 命令跳出当前函数(快捷键不是 f)
f 可以显示当前的行号和代码
until <number> 执行到指定行
backtrace 或 bt 显示每层正在执行的子程序的信息(stack frame). 这样就可以追踪当前的 function 是被哪一行调用,直到 main() 程序
shell <command> 来输入命令行命令 <command> 而无需退出 gdb 或者暂停程序
make 命令而无需在前面加 shell
-g3 编译,可以打出宏的信息,用 info macro 宏名,也可以直接 p 宏(...) 执行宏函数
gdb-ia 中,V(1:2,1:2,3,4) 这种语法是可以用的.
p V(1,1,1:2,1:2) 提示超过了 max-value-size,就用 set max-value-size unlimited 就可以解决
sudo apt install gdbserver(一般已经随系统安装).用 -g 选项编译一个程序,然后运行例如 gdbserver localhost:2000 main.x(其中 localhost 不需要替换为真正的 ip).
gdb,直接运行,不需要编译相同的 main.x(可能会导致 breakpoing 不能使用),但这么做的缺点是运行前要加载一大堆远程系统的 so 文件.然后 target remote xxx.xxx.xxx.xxx:2000.接下来就可以正常使用了 gdb 的各种命令了.如果显示 run 命令不能用,就直接 continue 即可.
gdbserver 会自动结束,本地的 gdb 也会断开链接.也就是说连接一次只能运行一次,需要再次在服务器中运行并连接.
 
 
 
 
 
 
 
 
 
 
 
友情链接: 超理论坛 | ©小时科技 保留一切权利