首页 » 信息技术 »

用gdb调试代码

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

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

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

$ gdb [-q] <your_program>

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

q[uit]

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

help <gdb_cmd>

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

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

b[reak] <line_number>

b指令用于设置断点,后面跟行号。

如何在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指令根据行号设置断点,下面就开始运行代码。

r[un]

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

程序在断点停下来后,一般就要开始一点点推进程序代码的执行,在过程中仔细检查各变量的值。

n[ext]

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

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".

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