使用GNUgdb调试Linux CC++可执行程序查看出错源代码、设置断点

使用GNUgdb调试Linux CC++可执行程序查看出错源代码、设置断点,第1张

gdb是GNU开源组织发布的一个强大的Linux程序调试工具,比图形化的调试工具更强大,主要来调试C/C++语言程序。

Debug 版本的可执行程序包含调试信息,用于程序员调试程序。

Release 版本的可执行程序往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以方便用户使用。

用gcc/g++编译时,要加上-g选项生成debug版本的可执行程序,否则就无法使用gdb调试了。

r 表示开始run, 如果在运行的过程中发生了错误,比如segmentation fault,可以查看此时的出错源代码:

通过b或者break设置断点,断点的设置可以通过函数名、行号、文件名+函数名、文件名+行号以及偏移量、地址等进行设置。

比如在function Peer_auto_save上设置断点,在peer.c的第136行设置断点:

从断点处继续运行

退出gdb

有两种办法, 1 利用 源文件+行号设置断点, 2 readelf -wi test >test.wi 在test.wi总查找你想设置断点的方法名称,然后能够找到这个方法对应的mangle以后的符号名称,在GDB中,用这个符号名称设置断点就可以了。

因本人通过几个小时的时间才解决这个问题,希望我的答案能节省大部分初学者在gdb上的时间。我也是今天才接触gdb,以下是有关深度linux V20的gdb调试问题的初步总结:

安装gdb方式,sudo apt-get install gdb ,有ok点击ok安装,直到安装结束。

gcc -g aa.c之后才能调试a.out文件。(aa.c表示你的源文件)

用法gdb a.out或者gdb进入后file a.out

l N是查看N行附近的代码,直接l是显示接下去的代码。r运行过程中遇到断点,按l则显示断点附近代码。

l 函数名是查看函数名里边的代码

q退出调试。

p 变量,查看变量即时值。

r运行。

n单步执行。

s单步执行-进入函数。

c连续多步运行,直到下个断点(循环的下一次断点)暂停。

b N第N行设置断点。

b 函数名,在函数名的入口处设置断点。

b 文件名:行号,在指定文件名行号设置断点。其中文件名是源文件的文件名。

(条件断点)b 行号 if 变量==N,表示该行号的断点必须满足变量==N的条件下才停下来。

ignore 断点编号 N,表示该断点编号在接下来的运行过程中忽略N次,即第N+1次该断点才会停下来。

info break显示全部断点。简写i b

delete 1-3删除编号为1到3的断点。简写 d 1-3。d 4只删除编号为4的断点。

delete break删除所有断点。无法简写

clear 20删除20行断点。

运行中disable break n 禁用断点号为n的断点。enable break n 使能断点为n的断点号重新启用。其中break可以简写为b

display {var1,var2,var3}自动显示var1~3变量的值。要删除display则用delete display N,N表示display的编号,如果不加N则表示删除全部的display。如果要自动显示数组内容,用display 数组名。注意:display需要r之后才能设置。

watch {var1,var2,var3}自动跟踪改变的值,只要有改变才显示watch。要删除watch,用d N,N代表watch编号,用i b可以查看该编号。注意:watch需要r之后才能设置。

gdb死循环程序按键盘ctrl+c可结束程序

****************

要查看内存地址的内容用x /nfu 内存地址。以下是n、f、u的解释

其中n表示要显示多少个内存单元。

f表示显示方式, 可取如下值

x 按十六进制格式显示变量。

d 按十进制格式显示变量。

u 按十进制格式显示无符号整型。

o 按八进制格式显示变量。

t 按二进制格式显示变量。

a 按十六进制格式显示变量。

i 指令地址格式

c 按字符格式显示变量。

f 按浮点数格式显示变量。

u表示一个地址单元的长度

b表示单字节,

h表示双字节,

w表示四字节,

g表示八字节

*****************


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/7790178.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-09
下一篇 2023-04-09

发表评论

登录后才能评论

评论列表(0条)

保存