gdb使用总结

GDB使用总结

1 core-dump问题

1 设置core文件大小

ulimit -c unlimited

2 修改core文件保存位置

sudo sysctl -w kernel.core_pattern=/tmp/core-%e.%p.%h.%t

通过下面命令查看core保存位置:

sysctl kernel.core_pattern

3 运行程序,用gdb执行产生的core文件`

gdb -c /tmp/core-vdpauinfo.103058.sw-server.1686296439

如果打出的信息中没有符号信息,文件名等信息都是问号(??),则用以下方法:

gdb bin文件   //如 gdb a.out
//在gdb内部执行以下命令
core-file core文件  //如core-file  /tmp/core-vdpauinfo.103058.sw-server.1686296439
//再执行bt或者where,即可显示函数、行号等信息
bt

2 打印问题

2.1 打印内存的值

x命令可以打印内存的值,格式如下:

x/nfu addr
#作用:以f指定的格式,从地址addr处拿出n个值打印,值的字节数由u指定
n:输出单元的个数
f:指定格式,x表示十六进制,u表示十进制,o表示八进制,t表示二进制
u:表明一个单元的长度,b是一个字节,h是两个字节(halfbyte),w是四个字节(word),

如:

(gdb) x/32xb buf
0x555557843f00: 0x00    0x00    0x3d    0x9b    0x65    0x88    0x84    0x17
0x555557843f08: 0xc9    0x80    0x5b    0xd8    0x00    0x09    0x40    0x8d
0x555557843f10: 0xf4    0xbf    0xe9    0x5f    0xc1    0x3e    0xfb    0xf2
0x555557843f18: 0x61    0x1a    0x25    0xfc    0x7f    0xa7    0x09    0x12

(gdb) x/32ub buf
0x555557843f00: 0       0       61      155     101     136     132     23
0x555557843f08: 201     128     91      216     0       9       64      141
0x555557843f10: 244     191     233     95      193     62      251     242
0x555557843f18: 97      26      37      252     127     167     9       18

(gdb) x/32tb buf
0x555557843f00: 00000000        00000000        00111101        10011011        01100101        10001000        10000100        00010111
0x555557843f08: 11001001        10000000        01011011        11011000        00000000        00001001        01000000        10001101
0x555557843f10: 11110100        10111111        11101001        01011111        11000001        00111110        11111011        11110010
0x555557843f18: 01100001        00011010        00100101        11111100        01111111        10100111        00001001        00010010

3 扩展宏

1 在编译时加上-g3选项
2 在gdb调试中使用命令macro expand 宏名
如:

 macro expand UPDATE_CACHE(re, s)
expands to: re_cache = av_bswap32((((const union unaligned_32 *) ((s)->buffer + (re_index >> 3)))->l)) << (re_index & 7)
如果工程很大,头文件很多,而有几个头文件又经常要用的,那么: 1、把这些头文件全部写到一个头文件中,比如:preh.h 2、写一个preh.c,里面的包含库文件,只要一句话#include"preh.h" 3、对于preh.c,在project settings 里面设置creat precompilesd headers ,对于其他.c文件,设置use precompiled header file 。 预编译头文件:就是把一个工程中的那一部分代码,预先编译好放在一个文件里(通常是以.pch为扩展名的),这个文件就成为预编译头文件。这些预先编译好的代码可以是任何的C/C++代码,甚至是inline的函数,但必须是稳定的在工程开发的过程中不会被经常改变。 编译器是以文件为单位编译的,一个文件经过修改后,会重新编译整个文件,当然在这个文件里包含的所有头文件中的东西都要重新处理一遍 预编译头的作用: 根据上文介绍,预编译头文件的作用当然就是提高便宜速度了,有了它你没有必要每次 都编译那些不需要经常改变的代码。编译性能当然就提高了。 预编译头的使用: 要使用预编译头,我们必须指定一个头文件,这个头文件包含我们不会经常改变的 代码和其他的头文件,然后我们用这个头文件来生成一个预编译头文件(.pch文件) 想必大家都知道 StdAfx.h这个文件。很多人都认为这是VC提供的一个“系统级别”的 ,编译器带的一个头文件。其实不是的,这个文件可以是任何名字的。我们来考察一个 典型的由AppWizard生成的MFC Dialog Based 程序的预编译头文件。(因为AppWizard 会为我们指定好如何使用预编译头文件,默认的是StdAfx.h,这是VC起的名字)。我们 会发现这个头文件里包含了以下的头文件: #include // MFC core and standard components #include // MFC extensions #include // MFC Automation classes #include // MFC support for Internet Explorer 4 Common Controls #include 这些正是使用MFC的必须包含的头文件,当然我们不太可能在我们的工程中修改这些头文 件的,所以说他们是稳定的。 那么我们如何指定它来生成预编译头文件。我们知道一个头文件是不能编译的。所以我 们还需要一个cpp文件来生成.pch 文件。这个文件默认的就是StdAfx.cpp。在这个文件 里只有一句代码就是:#include “Stdafx.h”。原因是理所当然的,我们仅仅是要它能 够编译而已?D?D?D也就是说,要的只是它的.cpp的扩展名。 我们可以用/Yc编译开关来指 定StdAfx.cpp来生成一个.pch文件,通过/Fp编译开关来指定生成的pch文件的名字。打 开project ->Setting->C/C++ 对话框。把Category指向Precompiled Header。在左边的 树形视图里选择整个工程  Project Options(右下角的那个白的地方)可以看到 /Fp “debug/PCH.pch”,这就是指 定生成的.pch文件的名字,默认的通常是 .pch(我的示例工程名就是PCH)。 然后,在左边的树形视图里选择StdAfx.cpp.//这时只能选一个cpp文件! 这时原来的Project Option变成了 Source File Option(原来是工程,现在是一个文件 ,当然变了)。在这里我们可以看到 /Yc开关,/Yc的作用就是指定这个文件来创建一个 Pch文件。/Yc后面的文件名是那个包含了稳定代码的头文件,一个工程里只能有一个文 件的可以有YC开关。VC就根据这个选项把 StdAfx.cpp编译成一个Obj文件和一个PCH文件 。 然后我们再选择一个其它的文件来看看,//其他cpp文件 在这里,Precomplier 选择了 Use ⋯⋯⋯一项,头文件是我们指定创建PCH 文件的stda fx.h 文件。事实上,这里是使用工程里的设置,(如图1)/Yu”stdafx.h”。 这样,我们就设置好了预编译头文件。也就是说,我们可以使用预编译头功能了。以 下是注意事项: 1):如果使用了/Yu,就是说使用了预编译,我们在每个.cpp文件的最开头,我强调一遍 是最开头,包含 你指定产生pch文件的.h文件(默认是stdafx.h)不然就会有问题。如 果你没有包含这个文件,就告诉你Unexpected file end. 如果你不是在最开头包含的, 你自己试以下就知道了,绝对有很惊人的效果⋯.. fatal error C1010: unexp
### GDB调试器使用方法 #### 编译带有调试信息的程序 为了能够有效地利用GDB进行调试,编译源代码时应当加入`-g`参数以便包含必要的调试信息。例如,如果有一个C文件名为`test.c`,可以通过下面这条指令将其编译成可执行文件: ```bash gcc -g test.c -o test ``` 此操作会在生成的目标文件中嵌入额外的信息用于支持后续的调试工作[^3]。 #### 启动GDB并加载目标程序 启动GDB的方式很简单,只需在终端输入`gdb`加上待调试的应用名称作为参数即可。比如针对上面提到的例子可以这样调用: ```bash gdb ./test ``` 一旦进入GDB环境之后,就可以通过一系列命令来进行断点设置、单步执行以及变量查看等动作了[^1]。 #### 基础命令概览 以下是几个常用的GDB基础命令列表: - `run`: 开始运行被调试的程序; - `breakpoint function_name/line_number`: 设置断点于指定函数或者某一行处; - `continue`: 继续执行直到遇到下一个断点为止; - `next`: 执行下一条语句而不深入子过程内部; - `step`: 进入当前行所调用的方法体内继续跟踪其逻辑流程; - `print variable/expression`: 显示特定变量或表达式的值; 这些只是入门级别的功能介绍,实际上GDB还提供了许多高级特性供更复杂的场景需求使用[^2]。 #### 安装方式简介 对于大多数现代Linux发行版而言,默认情况下已经预装好了GDB工具链。如果没有的话,则可以根据具体平台选用合适的包管理器来完成安装任务。例如,在基于Debian系统的机器上可通过如下命令快速部署最新稳定版本: ```bash sudo apt-get update && sudo apt-get install gdb ``` 而对于RedHat系操作系统则应采取yum/yumdnf途径实现相同目的。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值