读书笔记
1 预处理in.c out.i
gcc–E b.c –o b.i //让程序在预处理结束后停止编译过程 –E
2编译 in.i out.s
gcc–S b.i –o b.s
3.汇编 in.s out.o
gcc–c b.s –o b.o
4链接 输入为.o和其他的代码文件和库文件
gccb.o –o b
输出b就是一个可执行文件
如何使用GDB
首先编译时候要加入调试信息,用命令
gcc–g b.c –o b、、、、-g、-ggdb、-g3和-ggdb3
打开gdb调试 b
命令:gdb b
运行:run 会显示错误在那里
回溯:backtrace(bt)显示具体错误信息
显示错误代码 frame n
设置断点 break(b)
break<function>在进入指定函数时停住
break<linenum> 在指定行号前停住
break+-offset 在当前行号的前面(+)offset处停住 (-)后
break if(condition)在什么条件下停住
break没有参数代表在下一条指令处停住
breakfilename:function/linenum在源文件filename的。。。处停住
break*address在程序运行的内存处停止
delete 1 删除断点 1是断点的序号
break后面跟的那些参数很多其他的命令 比如list jump都可以用
watch i 变量i值有变化就停止
运行run(r)终止kill
单步进入函数step(s)
单步不进入函数next
print(查看运行时数据,print和$符号使用,以及输出格式)
print<expr> print/<fmt> <expr>
printa; print $;print $$;print $n
print/aa 显示十六进制格式的a (Xduotacf)
print还可以赋值print a=100;
display 自动显示命令
display<expr> display/<fmt><expr> display/<fmt><addr>
expr是一个表达式 fmt显示格式 addr表示内存地址
undisplay<dnums> delete display<dnums> 删除显示
disabledisplay<dnums> enable display<dnums> 失效或者恢复显示 info display 显示序号信息及是否有效等信息
显示的每一个变量都会加一个序号dnum,对dnum操作即可实现删除或者失效否
display/i $pc $pc 是gdb环境变量,就是指令的地址,/i表示显示机器码,也即是汇编代码。停止时会显示机器码和代码对应情形。
examine(x)查看内存
x/<n/f/u><addr> fu是参数可以独立或者联合使用,n正整数表示显示几个内存的内容 ;f格式,支持s,i格式;u字节数,bhwg分别表示1248个字节
set命令很强大
info
list(显示代码)
quit(退出gdb)
watchbachtrace frame n examine signal return call make shell//这两个需要系统支持(我的是在win7下mingw不可以,没装mnys)