用GDB调试程序【for_wind】

//gdb调试相关的学习笔记~ for_wind

用GDB调试程序

http://wiki.ubuntu.org.cn/%E7%94%A8GDB%E8%B0%83%E8%AF%95%E7%A8%8B%E5%BA%8F

GDB的基本工作原理剖析

http://www.embeddedlinux.org.cn/html/xinshourumen/201304/06-2530.html
通过一个系统调用:ptrace。说明:ptrace系统调用提供了一种方法来让父进程可以观察和控制其它进程的执行,检查和改变其核心映像以及寄存器。 主要用来实现断点调试和系统调用跟踪。(man手册)


gdb的启动
一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先 在编译时,我们必须要把调试信息加到可执行文件中。使用编译器( cc/gcc/g++)的 -g 参数可以做到这一点。如:
gcc -g hello.c -o hello 
g++ -g hello.cpp -o hello

如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行 时的内存地址。


gdb命令
我们简要介绍一下在gdb调试中需要用到的命令
file [filename]
      装入想要调试的可执行文件
kill [filename]
      终止正在调试的程序
break [file:]function
      在(file文件的)function函数中设置一个断点
clear
      删除一个断点,这个命令需要指定代码行或者函数名作为参数
run [arglist]
      运行您的程序 (如果指定了arglist,则将arglist作为参数运行程序)
bt Backtrace
      显示程序堆栈信息
print expr
      打印表达式的值
continue
      继续运行您的程序 (在停止之后,比如在一个断点之后)
list
      列出产生执行文件的源代码的一部分
next
      单步执行 (在停止之后); 跳过函数调用(与step相对应,step会进入函数内部)
nexti
      执行下一行的源代码中的一条汇编指令
set
      设置变量的值。例如:set nval=54 将把54保存到nval变量中;设置输入参数也可以通过这个命令(例如当三个入参分别为a、b、c的话,set args a b c)
step
      单步执行 (在停止之后); 进入函数调用
stepi
      继续执行程序下一行源代码中的汇编指令。如果是函数调用,这个命令将进入函数的内部,单步执行函数中的汇编代码
watch
      使你能监视一个变量的值而不管它何时被改变
rwatch
      指定一个变量,如果这个变量被读,则暂停程序运行,在调试器中显示信息,并等待下一个调试命令。参考rwatch和watch命令
awatch
      指定一个变量,如果这个变量被读或者被写,则暂停程序运行,在调试器中显示信息,并等待下一个调试命令。参考rwatch和watch命令
Ctrl-C
      在当前位置停止执行正在执行的程序,断点在当前行
disable
      禁止断点功能,这个命令需要禁止的断点在断点列表索引值作为参数
display
      在断点的停止的地方,显示指定的表达式的值。(显示变量)
undisplay
      删除一个display设置的变量显示。这个命令需要将display list中的索引做参数
enable
      允许断点功能,这个命令需要允许的断点在断点列表索引值作为参数
finish
      继续执行,直到当前函数返回
ignore
      忽略某个断点制定的次数。例:ignore 4 23 忽略断点423次运行,在第24次的时候中断
info [name]
      查看name信息
load
      动态载入一个可执行文件到调试器
xbreak
      在当前函数的退出的点上设置一个断点
whatis
      显示变量的值和类型
ptype
      显示变量的类型
return
      强制从当前函数返回
txbreak
      在当前函数的退出的点上设置一个临时的断点(只可使用一次)
make
      使你能不退出 gdb 就可以重新产生可执行文件
shell
      使你能不离开 gdb 就执行 UNIX shell 命令
help [name]
      显示GDB命令的信息,或者显示如何使用GDB的总体信息
quit
      退出gdb.


gdb -tui 代码窗口相关命令:

info win 显示窗口的大小

layout next 切换到下一个布局模式

layout prev 切换到上一个布局模式

layout src 只显示源代码

ctrl+x+a 退出layout

layout asm 只显示汇编代码

layout split 显示源代码和汇编代码

layout regs 增加寄存器内容显示

focus cmd/src/asm/regs/next/prev 切换当前窗口

refresh 刷新所有窗口

tui reg next 显示下一组寄存器

tui reg system 显示系统寄存器

update 更新源代码窗口和当前执行点

winheight name +/- line 调整name窗口的高度

tabset nchar 设置tab为nchar个字符

gdb在执行中,会自动跟踪代码



保存和恢复断点信息:
(gdb) help save breakpoints 
Save current breakpoint definitions as a script.
This includes all types of breakpoints (breakpoints, watchpoints,
catchpoints, tracepoints). Use the 'source' command in another debug
session to restore them.

保存断点
(gdb)  save breakpoints gdb.cfg  
加载断点
(gdb)  source gdb.cfg 


断点设置

gdb断点分类:

以设置断点的命令分类:

breakpoint

可以根据行号、函数、条件生成断点。

watchpoint

监测变量或者表达式的值发生变化时产生断点。

catchpoint

监测信号的产生。例如c++的throw,或者加载库的时候。

gdb中的变量从1开始标号,不同的断点采用变量标号同一管理,可以 用enable、disable等命令管理,同时支持断点范围的操作,比如有些命令接受断点范围作为参数。

具体命令略。

你可能感兴趣的:(Linux,gdb,调试,linux)