linux命令之调试工具gdb

来源:互联网 发布:数据运营属于什么行业 编辑:程序博客网 时间:2024/05/17 23:35

转自:http://blog.csdn.net/zdl1016/article/details/6359024

强烈推荐参考文档: <GDB使用指南>. 新浪电子书有下载.


编译生成带调试信息的可执行文件,

gcc -g tst.c -o tst // 使用-g选项

 

所谓的带调试信息指的是: 把每一条执行汇编语句对应的源码的文件名以及所在的行号记录下来. 并不记录源代码内容本身.

 

gdb的常用命令:

l/list <n> // 列出第n行代码附近(上下文)的源码

l // 接着上一行往下显示源码

l - // 接着上一行往上显示源码

break 3 // 在第三行打上断线

break tst.c:28 // 指定在tst.c文件的第3行上打断点

break tst.c:func // 在指定文件的指定函数上打断点 =====>有用

clear 3 // 取消在第三行上打的断点

info break // 查看所有的断点标记 ======>有用

disable 3 // 禁用info显示出的编号为3的断点 ======>有用

r/run // 运行程序, run的简写

n/next // 单条语句执行, next的简写  如果遇到函数, 不会进入

s/step // 单步跟踪, 如果有函数, 会进入函数

(gdb) s

10      in tst.c // 执行完一步后, 下一次将要执行的代码行:位于tst.c文件的第10行(还没执行)

 

finish // 跳出当前函数, 并打印当前函数的返回结构

c/continue // 继续执行程序, 直到遇到下一个断点, continue的简写, 

p i // 打印变量i的值 查看局部堆栈上的变量值

p *vec2@5 // 打印已vec2为首地址的内存中,  往后的5个元素, 每个元素长度为根据首地址类型而定, 如果是char*, 则1个字节长

               如果vec2是int*, 则每个元素长度为4

举例 char* vec2 = xxx; 其中的各个元素内容为: 

            'a' 'b' 2 'd' 5 0 0 0 0 0 查看就是

"ab/002d/000/005/000/000/000"

数字按照 /xxx显示

 

bt // 查看函数调用堆栈

bt <n> // 只打印堆栈里面最新的n个frame

bt <-n> // 只打印堆栈里面最老的n个frame

q // 退出gdb

frame 3 // 查看堆栈上的某一个frame, 只有先切换到该frame, 才能查看该frame上的局部变量

info local // 查看当前frame里面全部的局部变量

info args // 查看当前frame的参数的全部入参的值

info frame // 查看当前frame的总体参数情况, (没什么用)

 

dir dirname // 设置搜索源代码的路径,多个路径已:分割 =======>非常有用!!!

show directories // 查询当前使用的搜索源代码的路径

 

查看源代码和汇编代码的对应

 disassemble main // 查看main函数对应的汇编代码

info line tst.c:<n> // n为行号, 查看文件的第n行对应的汇编代码地址

info line tst.c:func // func为函数名称, 查看文件中的func函数对应的汇编代码地址

 

如何attach到一个已经在运行的进程

gdb -p pid // 直接attach到某个进程, 该进程自动暂停, 可以使用c 使之继续执行

 

通过continue命令让程序跑起来之后, 如何再次中断程序执行?

ctrl+c

 

如何调试一个core文件?

假设 core文件是有 a.out文件产生的, 那么:

gdb a.out core

 

 

如何找到和可执行程序匹配的源文件代码?

假设可执行文件和源代码的路径关系如下:

     gdb_test/a/可执行程序

     gdb_test/b/源文件

 

方法1:

通过dir 设置搜索源代码的路径, 多个路径已:分割

dir gdb_test/b 即可. 会自动把gdb_test/b加到已有的搜索路径里面, 不会影响原有的路径. 可以通过show directories查看.

 

方法2:(不推荐)

切换gdb的工作路径到源代码所在的文件

1) 进入gdb

2) pwd 查看当前工作路径

3) 通过 cd 命令 把当前工作路径切换到源代码所在的路径下(eg:gdb_test/b/)下

 

当源文件有更新时(和可执行文件不匹配时), gdb会提示

warning: Source file is more recent than executable.

 

程序崩溃时是否产生了core文件? 

方法1:

ulimit -a, 如果core file size     为0, 则不产生core文件. 通过 ulimit -c unlimited使之产生

 

方法2:写一个可以崩掉的程序实验一把 如果提示(core dumped),则有.

eg:

nemo@vm04_sles10:a$ ./a.out 

Segmentation fault =======< core了, 但没有参数coredump文件

nemo@vm04_sles10:a$ ./a.out 

Segmentation fault (core dumped) ========< core了, 产生了coredump文件

 

若产生了core文件, core文件的存放路径和文件名是什么样的?

cat /proc/sys/kernel/core_pattern 根据core_pattern的值不同而不同

如果值为 core:

 系统会在程序当前目录,产生名为core的文件. 这根系统设置有关

如果值为 /corefile/core-%e-%p-%t

 存放路径为 /corefile/ 文件名为: 文件名为core-命令名-pid-时间戳


原创粉丝点击