我的博客:www.while0.com
我的博客:www.shishangguan.net
GDB调试:
-g 生成的可执行文件才可以用gdb调试 (建议在发行版中用strip filename 来把这些调试信息去除)
开始调试。
以下是基础调试命令:
help (class) 来获取帮助
list 或者l 来获取源代码
list n来获取某一行的代码
list fucname 来获取某个函数的代码
start (重新)开始执行程序
next(s) 逐行执行
step(s) 单步进入
bt(backtrace) 查看函数调用的栈阵和实参
f(frame) num 可以在函数间切换,num是栈帧号,由bt命令可以查看。
i(info) locals 查看当站栈帧函数的局部变量。
p(print) 打印一个变量的值
finish 结束当前函数运行并返回
set var x=y 设置x的值为y,y的值可以为变量或者数字
q(quiet) 退出调试
以下是断点调试命令:
display 每一步都显示一个变量的值
undisplay n 取消显示一个变量的值。n是那个显示值的编号。
b(break) n (表达式) 在第n行设置一个断点,如果表达式不为空,则只有满足表达式时断点才会停住
b(break) funcname 在函数funcname的第一行设置断点
c(continue) 运行到下一个断点。
i(info) breakpoints 显示所有断点
delete breakpoints n 删除编号为n的断点,不指定n的话则是全部删除
disable breakpoints n 暂时禁用编号为n的断点
enable n 恢复禁用的编号为n的断点
run 从头开始连续运行程序,只有遇到断点才会停止执行。
以下是观察点命令:
watch varname 观察一个变量名为varname的变量,如果该变量发生变化,就给出旧值和新值,如果不变化,则
i(info) watchpoints 查看已经设置的观察点
如果调试汇编语言,只能通过加断点,查看寄存器值的方法如下:
info registers的用法:
i(info) r(registers) #显示通用寄存器和段寄存器的值
i(info) r(registers) # 查看所有寄存器(包括浮点、多媒体)
i(info) r(registers) esp #显示指定寄存器的值
print的用法:
x的用法:
更详细的用法可以在gdb中输入 gdb x来查看。
注意:GDB可以执行shell命令,如要执行清屏命令 可以用 (gdb) shell clean即可。。
预处理
gcc -E hello.c -o hello.i 此处如果不用-o指定输出文件,则只会在屏幕显示输出结果
编译
gcc –S hello.i –o hello.s 必须指定输出文件。生成汇编代码
汇编
gcc -c hello.s -o hello.o 把汇编代码编译成机器码,但系统函数等还需要重新定位
连接
gcc hello.o –o hello.exe 不需要加选项
编译时给文件定义宏
-D
编译时取消宏
-U
如果要缩小文件体积,可以用strip来去掉符号表等调试信息。可以用file来查看是否stripped。