GDB常用命令总结

时间:2022-12-10 08:23:41

1.调函数可以用print或者call命令
2.start命令可以让程序开始执行并在第一条语句时暂停(相当于 b main;  run  ).
    在不以main开始的程序中(如其他语言的程序)很有效;
    全局类的构造函数可能在main执行之前被执行,start命令可以进入这些构造函数;
3.set exec-wrapper wrapper可以让被调试程序被其他的进程或者shell或者脚本调用起来然后在调试(机房133机子上试过不成功)
4.run后面可以跟上程序运行的参数(也可以用set args xxx来设定运行参数);
    程序下次运行run命令时,用的args是上一次的run后面跟的args,除非有新的args。
5.可以用show args来查看设置的args(set args或者 run args)。
6.path (dir)给当前程序的环境变量path前加入(dir)的路径;
    可以用$cwd或者.来代替(dir)
    show paths显示当前进程的path环境变量
7.show environment [varname]显示varname环境变量的值
    set environment varname[=value]设置环境变量的值;
    unset environment (varname)删除环境变量的值;
8.detach命令可以终止对一个已经运行的进程的调试,让其继续自动运行;
9.info thread 可以列出当前进程所有的线程
    thread (threadno)使当前调试进入指定的线程
10.调试子进程的一个方法是,当子进程被创建后让子进程sleep一段时间,然后在这段时间里边,gdb可以通过子进程的pid依附到子进程上从而调试子进程。
    另一个方法是(只在HP-UX和GNUlinux上),执行命令 set follow-fork-mode [parent|child]来指定调试父进程还是子进程;
11.GNU/linux提供一个bookmark功能--checkpoint,info checkpoints,restart (checkpoint-id), delete checkpoint (checkpoint-id).这些功能可以让程序返回设置bookmark的地方,所有的变量,程序状态不变;
    每次设置checkpoint其实是多创建一个进程,用来保存当前程序状态(因此,进程号会变化).程序本身之外的其他东西变化没办法返回。
12.break使进程停在任意时刻当程序到达breadpoint时;
    break后可跟行数,函数等一切可以标示程序执行点的表达方式。
    break后可以不跟参数,表示....?
    bread...if (cond)条件break
    tbreak (args)使设置的断点有效一次
    hbreak设置硬件支持的断点(主要用于EPROM/ROM代码调试)
    rbreak (regex)设置所有满足regex表达式的地方,如:rbreak . 设置所有函数前都有断点;
    enable,disable,delete可以有效,无效,删除breadpoints,watchpoints,checkpoints.
13.watch使进程停在任意时刻当观测的值变化时;
    甚至watch后边可以跟表达式,如:watch a+b/c
    可以使用rwatch来使进程停在任意时刻当变量被读时;
    可以使用地址作为watch的对象,如:watch *(int*)0x004ff2ff3ae
    可以使用awatch来使进程停在任意时刻当变量被读/写时;
    用print或者call调用函数时,break,watch,catch将在这种调用期间失效
14.catch (event)使进程在接收到特定消息时停住;
    (event)值可以是:throw,catch,exception,exception unhandled, assert, exec, syscall, syscall (name), fork, vfork
    tcatch (event)使有效一次;
15.clear (line,funcion)以行号或函数名删除断点,当没有line时,删除当前行的断点
16.delete (no)以断点号删除断点,当没有no时,删除所有的断点
17.ignore (bnum) (count)忽略断点bnum,忽略count次。可以省略。
18.commands (bnum)
   ... command-list ...
   end     指定当bnum号断点到达时,执行command-list这些命令;
    不指定bnum时,command-list自动附加到上次“设置”断点的地方(不是到达);
19.finish使程序执行直至本函数结束;
20.until (location) 使程序继续执行到本函数内的指定行,会在到达时或者跳出本函数时break
    不加参数时表示继续执行知道本代码文件中下一行代码,常用于跳出循环;
21.advance (location)和until很像,只是它不会跳出递归框架;..?
22.stepi [si]
23.nexti [ni] 表示执行一条机器指令后返回给debugger。
24.给特定线程设置断点:break (line) thread (threadno) [if ...]
25.backtrace (n)(-n)显示调用栈
    backtrace full显示调用栈和每个栈中局部变量的值;
26.frame (n)显示调用栈中序号为n的调用行;
27.list 显示代码
    set listsize (count)设置显示代码的行数;
28.edit (lineno,fun)可以编辑代码,需要输入编辑工具;
29.rev (exp)可以搜索exp表达式,并显示行号。[reverse-search (exp)]
    forward-search 和 search也可以,但是不好用
24.dir (dirname)可以指定source文件所在的位置。如果source和程序不在同一个文件夹可以用;
25.print (expr) 显示一个变量的值
    print /(x,d,u,o,t,a,c,f,s,r) (expr) 格式化显示一个变量的值
    print后面不跟expr时显示上一次显示的东西
    print *array@5   -->显示指针array的开始的5个值
26.x /(nfu) (addr) 显示内存addr
    n表示重复几次
    f表示显示格式(可以是x,d,u,o,t,a,c,s,f)
    u表示每个内存单元的字节数(可以是字节b,双字节h,四字节w,八字节g)
27.display自动显示变量
28.info macro (macro) 显示宏macro的定义
29.trace (location)是一种特殊的断点,它在到达断点时收集一些变量标示轨迹;(它是断点,所以可以用break相关的命令)
    用法:trace (location)
          actions
          >collect (var1),(var2),...   //var可以是变量名,或者已定义的变量$regs,$args,$locals
          >(other command)
          >end              //和commands命令很相似
    暂时不会用..?
30.更改一个变量的值可以  print i=4  或者 set var i=4;
31.whatis (var)查看一个变量的类型
32. jump (lineno,location) 将程序跳转到指定的地方;
    跳转后程序直接继续执行,可以和tbreak联合一起用
    jump并不改变调用栈
    相似于 set $pc = 0xNNN,设置指令指针寄存器的值
33.signal (signal)向程序发送一个signal信号
34.return (expression)将一个函数迅速返回,可以指定返回值(expression)
35.file (filename)指定一个文件来调试;
36.define (XXX)
    (some commands)
    end   用来定义用户自定义的命令
    $arg0...$arg9用来标示用户命令后跟的最多10个参数。
37.source (filename)用来执行用户定义的命令文件(或者脚本文件),文件中行开始为#的行为注释行;
38.printf “%。。。”,。。。 用来格式化输出
39.C-x a 组合键表示进入/离开TUI
40.C-x s 组合键表示进入/离开TUI,使用单键命令(不用按enter)
    单键包括:c,d,f,n,q,r,s,u,v,w.
41.C-L 组合键表示刷新代码显示窗口;
42.layout next 显示下一个画面表示法;
    layout src 显示代码窗口
    layout asm 显示汇编
    layout split 显示代码和汇编
    layout regs 显示register