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)  
        CMD     (18 lines)
(gdb) fs next  切换focus
Focus set to CMD window.
(gdb) info win 
        SRC     (36 lines)
        CMD     (18 lines)  
(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			//列出指令信息
info locals			//查看所有局部变量
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绝对路径和相对路径均可

你可能感兴趣的:(命令,linux必备知识)