Watch in DGB

有没有这样的经历,程序崩溃或者running abnormal, 经过一番调查,发现是某个变量被意外的改动了,但是到底是什么地方意外修改了我的数据呢?一般我们可以采用2分法逐步缩小怀疑对象的范围,可问题是很多“坏人”不是那么容易发现的。比如你看:

 

class arrowpig

{

  private:      

      char* m_pText;      

      std::list<char*> m_dataList;

  public:

        ~arrowpig()

        { 

              for(std::list<char*>::iterator iter=m_dataList.begin();iter!=m_dataList.end();iter++)

             {             

                  delete (*iter);    

             }       

        }

 };

 

#include <ThirdPartyLib.h>  //我们的程序用了第三方的库

 

arrowpig inst;

……

ThirdPartyLib::someClass 3rdInst(para1,para2,para3);

 

我发现只要一执行ThirdPartyLib::someClass 的构造函数,arrowpig实例inst的内容就被修改了,于是造成inst析构时crash! 这个时候比较适合在GDB中使用watch命令:

 

gdb> watch inst.m_pText

 

这样,每当inst.m_pText中的内容被改动(读或者写)的时候,程序都会停下来,然后用where命令就能比较方便的定位罪魁祸首。但是注意一点,使用watch以后,程序会运行得非常的慢,所以实际操作的时候一定先要大致确认怀疑对象,在即将执行你怀疑的代码之前设置断点,然后使用watch,目的是减少受watch影响的范围。

 

上面这个问题最后发现是 由于我们include的第三方库的头文件版本和实际link的库文件版本不一致。

 

头文件告诉我们ThirdPartyLib::someClass 占用100字节,但是库的实现文件认为是120个字节,于是在构造函数中修改了后面的20个字节,破坏了同样在栈中的属于arrowpig实例的内容。

 

<think>我们正在讨论如何检查dgb是否已安装。首先需要明确dgb是什么?根据常见开发工具,dgb可能指代的是调试器(debugger),但具体名称可能有多种。在Linux环境中,常见的调试器包括gdb(GNU Debugger)和lldb(LLVM Debugger)等。因此,用户可能指的是gdb(因为dgb可能是gdb的拼写错误)。当然,也有可能是其他工具,但考虑到常见性,我们以gdb为例进行说明。 如果用户确实指的是gdb,那么检查gdb是否安装的方法如下: ### 方法1:使用终端命令检查版本 在终端中运行以下命令: ```bash gdb --version ``` 如果gdb已安装,将显示版本信息;如果未安装,则会提示“command not found”或类似信息。 ### 方法2:检查安装包 在基于Debian的系统(如Ubuntu)上,可以使用dpkg命令: ```bash dpkg -l | grep gdb ``` 在基于RPM的系统(如CentOS)上,可以使用rpm命令: ```bash rpm -qa | grep gdb ``` ### 方法3:使用which或command命令 ```bash which gdb ``` 或者 ```bash command -v gdb ``` 如果已安装,将返回gdb的安装路径;否则,没有输出或提示未找到。 ### 方法4:直接尝试运行gdb 在终端中直接输入: ```bash gdb ``` 如果进入gdb交互环境,则说明已安装;如果提示未找到命令,则未安装。 ### 注意事项 1. 如果未安装,可以根据系统使用包管理器安装: - Debian/Ubuntu: `sudo apt install gdb` - CentOS/RHEL: `sudo yum install gdb` 或 `sudo dnf install gdb` - Arch Linux: `sudo pacman -S gdb` 2. 如果用户指的是其他调试器(如lldb),则类似地可以使用`lldb --version`等命令检查。 §§相关问题§§ 1. 如何安装gdb调试器? 2. gdb调试器的基本使用方法有哪些? 3. 除了gdb,还有哪些常用的调试器? 4. 如何配置gdb以支持更好的调试体验?</think>### 如何检查 GDB 是否已安装 GDB(GNU Debugger)是 Linux 系统常用的调试工具。以下是检查方法: #### 方法 1:终端命令检查 在终端执行: ```bash gdb --version ``` - ✅ 若已安装:显示版本信息(如 `GNU gdb (Ubuntu 12.1-3ubuntu1) 12.1`) - ❌ 若未安装:提示 `command not found` 或 `未找到命令` #### 方法 2:包管理器查询 **Debian/Ubuntu 系统**: ```bash dpkg -l | grep gdb ``` 若输出包含 `ii gdb` 表示已安装[^1]。 **CentOS/RHEL 系统**: ```bash rpm -qa | grep gdb ``` #### 方法 3:检查可执行文件路径 ```bash which gdb # 或 command -v gdb ``` 若返回路径(如 `/usr/bin/gdb`)则已安装。 #### 方法 4:直接运行测试 ```bash gdb -q -ex "quit" # 静默启动后退出 echo $? # 返回 0 表示成功 ``` #### 安装方法(若未安装) ```bash # Debian/Ubuntu sudo apt install gdb # CentOS/RHEL sudo yum install gdb # Arch Linux sudo pacman -S gdb ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值