此文为个人笔记,排版随意仅供自己查看。
一、用gdb调试分N步:
1、gcc编译源文件时加上-g选项。
2、在终端中输入 gdb [file] 进入gdb调试模式。
3、在gdb模式下输入命令 l显示源代码(每次显示10行)
4、输入命令 b [行号] 在指定行号设置断点
5、输入命令 r [参数] [参数] ... 开始运行程序。(参数为main函数的参数argv)
6、输入命令 n 单步步过 / s 单独步入 / c 继续运行到下个断点 来调试。
7、输入命令 p [表达式] 打印表达式的值
...
n、输入命令 q 退出调试
补充:
1、gcc编译源文件时加上-g选项。
因为用gcc默认选项生成的可执行文件中并没有源代码,因此需要在gcc编译时加上-g才能用gdb调试,例如:
Test:test.o
g++ test.o -o Test
test.o:test.cc
g++ test.cc -c -g
各命令全名称:
l = list
b = break (breakpoint)
r = run
n = next
s = stepc = continue
p = print
q = quit
命令详解:
1、list
list [n行数] 以第n行开始显示
list [n1行数],[n2行数] 显示n1~n2行
list [file源文件名]:[n行数] 以file源文件第n行开始显示
list [file源文件名]:[fun函数名] 显示file源文件的fun函数
2、break
break [n行数] 在某行断点
break [n行数] if [bool型表达式] 条件断点
各种特殊情况处理:
1、打印errno的值
因为errno是一个宏而并非一个变量,因此可以通过这样来打印:
p *__errno_location()
应该都知道errno是一个宏定义实际是函数吧。
2、调试fork进程
默认情况下fork之后是跟踪原来进程而非父进程,可以通过下面代码切换:
set follow-fork-mode child
跟踪子进程
set follow-fork-mode parent
跟踪原进程(默认情况)
反汇编篇:
反汇编相关命令详解:
1、disassemble
disassemble 显示当前执行行附近的反汇编代码
disassemble [fun函数名] 显示fun函数的反汇编代码
disassemble [addr1起始内存地址] [addr2终结内存地址] 显示addr1~addr2地址之间的反汇编代码
3、watch
watch [addr内存地址] 当此addr地址内容被写的时候中断
设置指令:
set disassembly-flavor intel 设置反汇编代码为intel格式 (默认为AT&T)