gdb 使用入门

本文章转载前面一部分,后面为原创

 命令 解释 示例
file <文件名>加载被调试的可执行程序文件。
因为一般都在被调试程序所在目录下执行GDB,因而文本名不需要带路径。
(gdb) file gdb-sample
rRun的简写,运行被调试的程序。
如果此前没有下过断点,则执行完整个程序;如果有断点,则程序暂停在第一个可用断点处。
(gdb) r
cContinue的简写,继续执行被调试程序,直至下一个断点或程序结束。(gdb) c
b <行号>
b <函数名称>
b *<函数名称>
b *<代码地址>

d [编号]

b <条件>

b: Breakpoint的简写,设置断点。两可以使用“行号”“函数名称”“执行地址”等方式指定断点位置。

其中在函数名称前面加“*”符号表示将断点设置在“由编译器生成的prolog代码处”。如果不了解汇编,可以不予理会此用法。

条件断点,表示当条件为真时停住程序

d: Delete breakpoint的简写,删除指定编号的某个断点,或删除所有断点。断点编号从1开始递增。

(gdb) b 8
(gdb) b main
(gdb) b *main
(gdb) b *0x804835c

(gdb) d

(gdb) break if i=100

s, ns: 执行一行源程序代码,如果此行代码中有函数调用,则进入该函数;
n: 执行一行源程序代码,此行代码中的函数调用也一并执行。

s 相当于其它调试器中的“Step Into (单步跟踪进入)”;
n 相当于其它调试器中的“Step Over (单步跟踪)”。

这两个命令必须在有源代码调试信息的情况下才可以使用(GCC编译时使用“-g”参数)。

(gdb) s
(gdb) n
si, nisi命令类似于s命令,ni命令类似于n命令。所不同的是,这两个命令(si/ni)所针对的是汇编指令,而s/n针对的是源代码。(gdb) si
(gdb) ni
p <变量名称>Print的简写,显示指定变量(临时变量或全局变量)的值。(gdb) p i
(gdb) p nGlobalVar
display ...

undisplay <编号>

display,设置程序中断后欲显示的数据及其格式。
例如,如果希望每次程序中断后可以看到即将被执行的下一条汇编指令,可以使用命令
“display /i $pc”
其中 $pc 代表当前汇编指令,/i 表示以十六进行显示。当需要关心汇编代码时,此命令相当有用。

undispaly,取消先前的display设置,编号从1开始递增。

(gdb) display /i $pc

(gdb) undisplay 1

i

Info的简写,用于显示各类信息,详情请查阅“help i”。

info break 查看所有断点信息

(gdb) i r
qQuit的简写,退出GDB调试环境。(gdb) q
help [命令名称]GDB帮助命令,提供对GDB名种命令的解释说明。

如果指定了“命令名称”参数,则显示该命令的详细说明;如果没有指定参数,则分类显示所有GDB命令,供用户进一步浏览和查询。

help all 查看所有命令

(gdb) help display

list [缩写 l ]列出代码源码(gdb) l

bt查看函数调用堆栈(gdb) bt
frame <n> 查看当前栈层的信息,frame 或 f (gdb) f 2

disassemble查看调用堆栈的汇编信息(gdb) disassemble
finish退出函数。(gdb) finish
core用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件(gdb) core
info frame或者
info f
 这个命令会打印出更为详细的当前栈层的信息,只不过,大多数都是运行时的内内地址。比如:函数地址,调用函数的地址,被调用函数的地址,目前的函数是由什么样的程序语言写成的、函数参数地址及值、局部变量的地址等等(gdb) info f
info args打印出当前函数的参数名及其值。(gdb) info args
info locals打印出当前函数中所有局部变量及其值(gdb) info locals
info catch打印出当前的函数中的异常处理信息(gdb) info catch

启动gdb时
gdb <program> <PID>如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到

GDB启动时,可以加上一些GDB的启动开关,详细的开关可以用gdb -help查看。我在下面只例举一些比较常用的参数:

    -symbols <file> 
    -s <file> 
    从指定文件中读取符号表。

    -se file 
    从指定文件中读取符号表信息,并把他用在可执行文件中。

    -core <file>
    -c <file> 
    调试时core dump的core文件。

    -directory <directory>
    -d <directory>
    加入一个源文件的搜索路径。默认搜索路径是环境变量中PATH所定义的路径。


list <linenum>
        显示程序第linenum行的周围的源程序。
    
    list <function> 
        显示函数名为function的函数的源程序。
        
    list 
        显示当前行后面的源程序。
    
    list - 
        显示当前行前面的源程序。

一般来说在list后面可以跟以下这们的参数:

    <linenum>   行号。
    <+offset>   当前行号的正偏移量。
    <-offset>   当前行号的负偏移量。
    <filename:linenum>  哪个文件的哪一行。
    <function>  函数名。
    <filename:function> 哪个文件中的哪个函数。
    <*address>  程序运行时的语句在内存中的地址


https://blog.youkuaiyun.com/liigo/article/details/582231/

x /i $pc

你可以使用info line命令来查看源代码在内存中的地址。info line后面可以跟“行号”,“函数名”,“文件名:行号”,“文件名:函数名”,这个命令会打印出所指定的源码在运行时的内存地址,如:

        (gdb) info line tst.c:func
        Line 5 of "tst.c" starts at address 0x8048456 <func+6> and ends at 0x804845d <func+13>.

还有一个命令(disassemble)你可以查看源程序的当前执行时的机器码,这个命令会把目前内存中的指令dump出来。如下面的示例表示查看函数func的汇编代码。

        (gdb) disassemble func
        Dump of assembler code for function func:
        0x8048450 <func>:       push   %ebp
        0x8048451 <func+1>:     mov    %esp,%ebp
        0x8048453 <func+3>:     sub    $0x18,%esp
        0x8048456 <func+6>:     movl   $0x0,0xfffffffc(%ebp)
        0x804845d <func+13>:    movl   $0x1,0xfffffff8(%ebp)
        0x8048464 <func+20>:    mov    0xfffffff8(%ebp),%eax
        0x8048467 <func+23>:    cmp    0x8(%ebp),%eax
        0x804846a <func+26>:    jle    0x8048470 <func+32>
        0x804846c <func+28>:    jmp    0x8048480 <func+48>
        0x804846e <func+30>:    mov    %esi,%esi
        0x8048470 <func+32>:    mov    0xfffffff8(%ebp),%eax
        0x8048473 <func+35>:    add    %eax,0xfffffffc(%ebp)
        0x8048476 <func+38>:    incl   0xfffffff8(%ebp)
        0x8048479 <func+41>:    jmp    0x8048464 <func+20>
        0x804847b <func+43>:    nop
        0x804847c <func+44>:    lea    0x0(%esi,1),%esi
        0x8048480 <func+48>:    mov    0xfffffffc(%ebp),%edx
        0x8048483 <func+51>:    mov    %edx,%eax
        0x8048485 <func+53>:    jmp    0x8048487 <func+55>
        0x8048487 <func+55>:    mov    %ebp,%esp
        0x8048489 <func+57>:    pop    %ebp
        0x804848a <func+58>:    ret
        End of assembler dump.


查看运行时数据
———————

    
    在你调试程序时,当程序被停住时,你可以使用print命令(简写命令为p),或是同义命令inspect来查看当前程序的运行数据。print命令的格式是:
    
    print <expr>
    print /<f> <expr>

        <expr>是表达式,是你所调试的程序的语言的表达式(GDB可以调试多种编程语言),<f>是输出的格式,比如,如果要把表达式按16进制的格式输出,那么就是/x


查看内存

    你可以使用examine命令(简写是x)来查看内存地址中的值。x命令的语法如下所示:
    
    x/<n/f/u> <addr> 
    
    n、f、u是可选的参数。
    
    n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。
    f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。
    u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。
    
    <addr>表示一个内存地址。

    n/f/u三个参数可以一起使用。例如:
    
    命令:x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十六进制显示。


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

gdb的命令很多,gdb将之分成许多种类。help命令只是列出gdb的命令种类

种类描述
aliasesAliases of other commands
breakpointsMaking program stop at certain points
dataExamining data
filesSpecifying and examining files
internalsMaintenance commands
obscureObscure features
runningRunning the program
stackExamining the stack
statusStatus inquiries
supportSupport facilities
tracepointsTracing of program execution without stopping the program
user-defined – User-defined commands



GDB使用手册 GDB调试使用手册(一) ................................................................................................. 1 使用GDB: ........................................................................................................................ 1 GDB简介 ......................................................................................................................... 3 GDB的作者 ..................................................................................................................... 3 GDB调试使用手册(二) ................................................................................................. 4 GDB调试使用手册(三) ................................................................................................. 9 运行GDB(一些详细的说明) ........................................................................................... 9 谈谈模式的设置............................................................................................................. 11 GDB调试使用手册(四) ............................................................................................... 12 退出gdb ......................................................................................................................... 12 Shell 命令 ....................................................................................................................... 12 GDB 命令 ...................................................................................................................... 12 Command语法 ............................................................................................................... 13 GDB调试使用手册(五) ............................................................................................... 13 输入命令的技巧............................................................................................................. 13 GDB调试使用手册(六-1) ............................................................................................ 14 得到帮助 ........................................................................................................................ 14 在gdb下运行你的程序 ................................................................................................. 16 GDB调试使用手册(六-2)程序环境 ............................................................................ 19 工作路径 ........................................................................................................................ 19 你程序的输入/输出 ....................................................................................................... 20 调试一个已经运行的程序: ......................................................................................... 20 GDB调试使用手册(七) ............................................................................................... 21 结束子进程 .................................................................................................................... 21 附加的进程信息............................................................................................................. 21 对多线程程序的调试 ..................................................................................................... 22 调试多进程的程序 ......................................................................................................... 23 停止和继续 .................................................................................................................... 24 断点,观察点和异常 ..................................................................................................... 24 DB调试使用手册(八) ............................................................................................... 25 设置断点 ........................................................................................................................ 25 设置观察点 .................................................................................................................... 27 断点和异常 .................................................................................................................... 28 DB调试使用手册(九) ............................................................................................... 29 断点条件 ........................................................................................................................ 29 断点命令列表................................................................................................................. 31 断点菜单 ........................................................................................................................ 32
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值