首页 » 信息技术 »

gdb常用命令

2020年12月21日 / 26次阅读
CC++

一直以来,我都习惯了使用printf来调试程序,现在这个习惯要增强一下了,printf 配合 gdb,熟练使用后,一定可以更灵活高效地调试代码。另外,gdb还有另一个用处,可以用来在代码执行过程中,进行代码的阅读理解。

要用gdb调试C或C++代码,在编译代码时,需要增加 -g-g3参数。(gcc常用编译参数

$ gdb [-q] <your_program>

-q(quiet)的作用在于,不用打印关于gdb的那些信息。很有命令行工具都有-q。

<your_program>程序的命令行参数不能再这个地方指定,要使用gdb的set args命令。

q[uit]

在gdb内部,退出gdb的指令。

set args

用于在run程序之前,指定此程序的命令行参数。

set print pretty on

漂亮的打印信息,总是需要的。

help <gdb_cmd>

在gdb中,以下介绍的命令,都可以用help指令查看联机帮助。

进入gdb后,我们要先设置断点:

b[reak] <line_number>

b指令用于设置断点,后面除了跟行号,还可以:

如果是多文件的场景设置断点:b <file_name>:<line_number>,此时file_name无需路径。

还可以直接用函数名设置断点:b function_name

或者: b <file_name>:<function_name>

还可以在设置断点的时候,增加一个condition:b location if cond

tbreak

临时断点,作用一次后自动消失,设置方式与break相同。

rbreak regex

对符合regex正则表达式条件的函数名设置断点,效果与break一样,不会自动消失。

如何在gdb中查看源代码和对应的行号:

l[ist]

l指令用于查看行号。l指令输入后,默认从当前位置打印10行代码出来显示,继续<RET>回车会自动继续显示10行代码。

改变list指令默认behavior可以这样:

l <line_number>

从指定行号开始打印10号代码。

l <start_line_number>,<end_line_number>

打印指定行号之间的所有代码。

l <function_name>

打印function函数的10行代码。

有了list指令查看代码和行号,有了break指令根据行号设置断点,下面就开始运行代码。

list中的10行代码是默认值,show listsize,查看此默认值,set listsize n,这是默认值为n

r[un]

r指令开始运行程序,直到程序结束,或者遇到breakpoint。所以,调试程序,如果没有设置breakpoint,就一口气执行完了,或者程序崩溃。

程序在断点停下来后,一般就要开始一点点推进程序代码的执行,在过程中仔细检查各变量的值。用r也可以在任何时候重新运行程序!

n[ext]

执行下一条指令,如果下一条指令是函数调用,不进入函数。

直接回车,重复上一个命令!如果上一个命令是n,就很有用。

s[tep]

执行下一条指令,如果下一条指令是函数调用,进入函数。

c[ontinue]

继续running,直到下一个breakpoint。

所以,run指令一般只用一次,然后就不再用了,后面要让程序继续跑起来,conitnue指令。

我们在分析程序运行状态的时候,常常会忘记程序当前停在什么位置:

where/bt

查看当前程序调用栈信息,可以获取程序当前停在哪一行。

info b

查看所有breakpoint信息,此处会显示出断点的编号n。help info可以看到更多关于info的选项。

delete n

删除n号断点。

delete breakpoints

清除所有断点。

disable/enable n

关闭/开启n号断点。

--------

调试代码过程中,我们要查看各种变量的信息,最简单直接的指令就是:

p[rint]

print指令后面跟一个表达式,显示表达式的值。

如果要同时显示多个变量的值:print {var1, var2, var3},这样。

还可以通过/fmt格式来增加格式信息,比如: p /x *b,以hex的方式打印b地址的内容。格式与x命令(examine memory)通用。x命令的help info:

(gdb) help x
Examine memory: x/FMT ADDRESS.
ADDRESS is an expression for the memory address to examine.
FMT is a repeat count followed by a format letter and a size letter.
Format letters are o(octal), x(hex), d(decimal), u(unsigned decimal),
t(binary), f(float), a(address), i(instruction), c(char), s(string)
and z(hex, zero padded on the left).
Size letters are b(byte), h(halfword), w(word), g(giant, 8 bytes).
The specified number of objects of the specified size are printed
according to the format. If a negative number is specified, memory is
examined backward from the address.

Defaults for format and size letters are those previously used.
Default count is 1. Default address is following last thing printed
with this command or "print".

查看宏

p命令还可以用来查看宏定义值,但是需要gcc编译的时候,带上-g3这个参数;另一个查看宏的命令是 macro expand <macro_name>

x

examine memory

display

设置在程序停止运行时,自动显示的表达式。在单步调试的时候,这个指令很有用,每次next,自动显示你关心的变量值。设置多个display,用多行命令,或者display {exp1, exp2, exp3}。display貌似只能在一个函数范围内有效。

undisplay

取消display。

本文链接:https://www.maixj.net/ict/gdb-24225

相关文章

留言区


前一篇:
后一篇:
-->只要几分钟回答问卷,就能轻松赚现金!

栏目精选

云上小悟,麦新杰的独立博客

Ctrl+D 收藏本页

栏目


©Copyright 麦新杰 Since 2014 云上小悟独立博客版权所有 备案号:苏ICP备14045477号-1。云上小悟网站部分内容来源于网络,转载目的是为了整合信息,收藏学习,服务大家,有些转载内容也难以判断是否有侵权问题,如果侵犯了您的权益,请及时联系站长,我会立即删除。

go to top