gdb gdbtui

1. gdbtui

  1. 打开tui模式
    gdbtui a.out
    gdb -tui a.out

  2. 调试一个正在运行的进程
    gdb -p pid

在linux自带的终端里是正常显示的,但是在securecrt里面,可能由于编码的问题,边缘会有些乱码,不过不影响使用(如果你的程序有错误输出,会扰乱整个界面,所以在调试的时候,建议添加2>/dev/null,这样的话基本可用)

(gdb) info win  查看当前focus
        SRC     (36 lines)  <has focus>
        CMD     (18 lines)
(gdb) fs next  切换focus
Focus set to CMD window.
(gdb) info win 
        SRC     (36 lines)
        CMD     (18 lines)  <has focus>
(gdb) fs SRC  切换指定focus
Focus set to SRC window.
(gdb)

上面是src窗口,下面是cmd窗口,默认focus在src窗口的,这样的话上下键以及pagedown,pageup都是在移动显示代码,并不显示上下的调试命令

2. gdb常用命令

start               //开始执行程序,停在main函数第一行语句前面等待命令
directory path      //添加一个路径,解决No such file or directory
print(p)            //打印变量内容
info(i) cmd         //列出指令信息
delete [num]        //删除断点
display var         //跟踪查看一个变量,每次停下来都显示它的值(取消undisplay)
backtrace(bt)       //查看各级函数调用及参数
set var=            //修改变量的值
sharedlibrary lib   //调试动态库
until [line]        //结束当前循环(,并跳到指定行)
finish              //跳出当前函数
return val          //跳出当前函数,并且返回指定值
i locals            //当前函数局部变量
cd                  //切换目录
pwd                 //显示当前路径
shell cmd           //执行shell命令
make                //调试中编译程序

3. gdb传入参数

(gdb) r 2 3
相当于:
# ./a.out 2 3

4. 格式数据

(gdb) p/x temp[35]
$29 = 0xd

x 按十六进制格式显示变量
d 按十进制格式显示变量
u 按十六进制格式显示无符号整型
o 按八进制格式显示变量
t 按二进制格式显示变量
a 按十六进制格式显示变量
c 按字符格式显示变量
f 按浮点数格式显示变量

5. core文件

# gdb a.out core 
where 

6. 调试子进程

(gdb) set follow-fork-mode child 

这样就可以断到子进程里面了,否则断点无效

7. 线程调试
info threads:显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID。 前面有*的是当前调试的线程
thread ID:切换当前调试的线程为指定ID的线程

(gdb) i threads 
 * 2 Thread 0x7ffff7fe9710 (LWP 70799)  0x0000003249aa6820 in sleep () from /lib64/libc.so.6
  1 Thread 0x7ffff7feb700 (LWP 70797)  main () at thread.c:26
(gdb) t 1
[Switching to thread 1 (Thread 0x7ffff7feb700 (LWP 70797))]#0  main () at thread.c:26
26              while(1);
(gdb) i threads 
  2 Thread 0x7ffff7fe9710 (LWP 70799)  0x0000003249aa6820 in sleep () from /lib64/libc.so.6
 * 1 Thread 0x7ffff7feb700 (LWP 70797)  main () at thread.c:26
(gdb) set scheduler-locking off|on|step

多线程同时执行一段代码。off 不锁定任何线程,也就是所有线程都执行,这是默认值。 on 只有当前被调试程序会执行

8. watch
watch通常需要和break,run,continue联合使用

(gdb) watch a              //观察a的值,当有变化时,停止
(gdb) watch *(long*)(a+4)

9. break

(gdb) b main
(gdb) b test.c:main
(gdb) b thread.c:26
(gdb) b test::test

10. 编译时附加编译选项

# CFLAGS="-g -O0" CPPFLAGS=-g ./configure

O0不进行编译优化,调试的时候就会顺畅了,运行流程不会跳来跳去的。发布项目的时候记得不要在使用 -O0参数项,gcc 默认编译或加上-O2优化编译会提高程序运行速度
前提:你的可执行文件和源码是一一对应的

当然,你不加优化也可以,直接-g即可

11. 如果出现如下错误
GDB调试时,提示动态库搜索路径有误。设置动态库搜索路径即可
应用如下命令:set sysroot、set solib-absolute-prefix或set solib-search-path
区别:

  • set sysroot 与 set solib-absolute-prefix 是同一条命令
  • set solib-search-path可设置多个搜索路径,路径之间以“冒号”分隔
  • solib-absolute-prefix设置库的绝对路径;solib-search-path绝对路径和相对路径均可
posted @ 2015-08-07 14:33  thomas_blog  阅读(110)  评论(0编辑  收藏  举报