GDB 内存断点

内存断点可以帮助我们查找一些内存的问题, 而内存问题往往都是比较棘手的问题。所以掌握GDB的内存调试还是很有用的,下来我们就开始GDB的内存断点之旅。

 

我们通过一个程序来学些这个方法:

 

注意涉及的指令就是rwatch、watch和awatch,分别表示读、写、读写。需要注意的是我用的这个版本直接用地址是断不下来的,必须用 *(char*) 之类来进行强制类型转换 ,不知道其它版本会不会也有同样的问题。
代码如下:
//main.cpp gdb memory break test code
#include
#include
int main()
{
       char buf[1024];
       char* pp = buf;
       printf("add buf = 0x%x/r/n",buf);
      
       for(int i=0;i
       {
              printf("addr = 0x%x ~~ 0x%x/r/n",pp+i*10,pp+i*10+9);
              memset(pp+i*10,0,10);
       }
       printf("end");
}
过程如下,我用的是cygwin模拟环境:
xxxx@97190913124F402 /cygdrive/f
$ gcc -g main.cpp -o main.out      //编译,注意-g
xxxx @97190913124F402 /cygdrive/f
$ gdb main.out –nw              //-nw表示用文本模式
GNU gdb 5.0 (20010428-3)
Copyright 2001 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i686-pc-cygwin"...
(gdb) list
1       #include
2       #include
3
4       int main()
5       {
6               char buf[1024];
7
8               char* pp = buf;
9               printf("add buf = 0x%x/r/n",buf);
10
(gdb) break 9 //第9行打断点
Breakpoint 1 at 0x40108a: file main.cpp, line 9.
(gdb) run        //运行
Starting program: /cygdrive/f/main.out
Breakpoint 1, main () at main.cpp:9
9               printf("add buf = 0x%x/r/n",buf);
Current language: auto; currently c++
(gdb) display &buf        //查看buf的地址
1: &buf = (char (*)[1024]) 0x23f994
(gdb) watch *(int*)0x23fA00       //写断点buf地址后的一点,保证其几个循环后被改写
Watchpoint 2: *(int *) 2357760
(gdb) c    //继续运行
Continuing.
add buf = 0x23f994
addr = 0x23f994 ~~ 0x23f99d
addr = 0x23f99e ~~ 0x23f9a7
……
addr = 0x23f9ee ~~ 0x23f9f7
addr = 0x23f9f8 ~~ 0x23fa01
Watchpoint 2: *(int *) 2357760    //断点触发
Old value = 2357808
New value = 2357760
0x6108bee3 in _libkernel32_a_iname ()
(gdb) info breakpoints         //删掉这些断点
Num Type           Disp Enb Address    What
1   breakpoint     keep y   0x0040108a in main at main.cpp:9
        breakpoint already hit 1 time
2   watchpoint     keep y              *(int *) 2357760
        breakpoint already hit 1 time
(gdb) delete 1
(gdb) delete 2
(gdb) info breakpoints
No breakpoints or watchpoints.
(gdb) c    //继续运行
Continuing.
addr = 0x23fa02 ~~ 0x23fa0b
……
addr = 0x23fd72 ~~ 0x23fd7b
end
Program exited normally.
(gdb)

 

关于GDB其他详细命令,可以参考这里

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GDB是一种功能强大的调试工具,可用于定位和调试程序中的内存泄漏问题。以下是使用GDB进行内存泄漏定位的常见步骤。 1. 编译程序时,加入-g选项以启用调试信息。例如,使用以下命令编译程序: `gcc -g -o your_program your_code.c` 2. 运行程序时,添加--leak-check选项以启用内存泄漏检查。例如,使用以下命令运行程序: `valgrind --leak-check=yes ./your_program` 3. 当程序运行结束后,Valgrind将会报告内存泄漏情况。在报告中,它将列出所有的内存泄漏,并显示泄漏的内存地址、大小、泄漏的位置等信息。 4. 在报告中找到泄漏的内存地址,这将帮助我们找到泄漏发生的位置。 5. 使用GDB调试器定位到发生泄漏的位置,可以通过以下命令启动GDB调试器: `gdb ./your_program` 6. 在GDB中,使用以下命令设置断点,将程序暂停在泄漏的位置: `break function_name` 或者 `break file_name:line_number` 7. 运行程序并让其在断点处停下来,使用以下命令: `run` 8. 当程序停在断点处时,可以使用GDB的各种命令来检查程序状态,例如使用`print`命令查看变量的值,使用`backtrace`命令查看调用堆栈等。 9. 通过分析程序状态和内存使用情况,可以找出引起内存泄漏的原因。可能是未正确释放动态分配的内存,或是不正确的内存管理操作。 10. 根据定位到的问题,修改代码以解决内存泄漏问题。 11. 重新编译和运行经过修改的程序,确保问题已经解决。 使用GDB进行内存泄漏定位需要对GDB的使用有一定的了解。这只是一种常见的使用方式,具体的操作和命令可能会因情况而有所不同。因此,针对具体问题使用GDB调试工具时,还应结合具体情况进行相应的操作和分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值