gdb内存检查

内存检查

gcc选项 -fsanitize=address

  • 检查内存泄漏
  • 检查堆溢出
  • 检查栈溢出
  • 检查全局内存溢出
  • 检查释放后再使用

示例代码

https://github.com/SimpleSoft-2020/gdbdebug/memcheck-section

检查内存泄漏

gdb memcheck-section -q

在这里插入图片描述

检查堆溢出

15525ERROR: AddressSanitizer: heap-buffer-overflow on address 0x60200000001a at pc 0x7ffff6e7e3a6 bp 0x7fffffffe080 sp 0x7fffffffd828
在这里插入图片描述

检查栈溢出

16569ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7fffffffe054 at pc 0x5555555553de bp 0x7fffffffdfe0 sp 0x7fffffffdfd0

在这里插入图片描述

检查全局内存溢出

18552ERROR: AddressSanitizer: global-buffer-overflow on address 0x5555557564f8 at pc 0x5555555554b1 bp 0x7fffffffe0c0 sp 0x7fffffffe0b0
在这里插入图片描述

小结

C++中,字符串存放在数组存放在全局变量存放在内存的全局存储区

检查释放后再使用

在这里插入图片描述

内存泄漏检查

call malloc_stats()
call malloc_info(0,stdout)

示例代码

https://github.com/SimpleSoft-2020/gdbdebug/memleak-section

在这里插入图片描述
命令

(gdb) l
6       #include <string>
7       #include <assert.h>
8       using namespace std;
9
10      void test_malloc_leak(int size)
11      {
12              malloc(1024);
13      }
---Type <return> to continue, or q <return> to quit---
14      void no_leak()
15      {
(gdb) b 16
Breakpoint 1 at 0x11d1: file main.cpp, line 16.
(gdb) r
Starting program: /root/cpp_project/gdb_project/gdbdebug/memleak-section/memleak-section 

Breakpoint 1, no_leak () at main.cpp:16
16              void *p=malloc(1024*1024*10);
(gdb) call malloc_stats()
Arena 0:
system bytes     =     135168
in use bytes     =      73312
Total (incl. mmap):
system bytes     =     135168
in use bytes     =      73312
max mmap regions =          0
max mmap bytes   =          0
(gdb) n
17              free(p);
(gdb) call malloc_stats()
Arena 0:
system bytes     =     135168
in use bytes     =      73312
Total (incl. mmap):
system bytes     =   10625024
in use bytes     =   10563168
max mmap regions =          1
max mmap bytes   =   10489856
(gdb) n
18      }
(gdb) call malloc_stats()
Arena 0:
system bytes     =     135168
in use bytes     =      73312
Total (incl. mmap):
system bytes     =     135168
in use bytes     =      73312
max mmap regions =          1
max mmap bytes   =   10489856
(gdb) n
main (argc=1, argv=0x7fffffffe1c8) at main.cpp:22
22              test_malloc_leak(1024);
(gdb) call malloc_stats()
Arena 0:
system bytes     =     135168
in use bytes     =      73312
Total (incl. mmap):
system bytes     =     135168
in use bytes     =      73312
max mmap regions =          1
max mmap bytes   =   10489856
(gdb) n
23              return 0;
(gdb) call malloc_stats()
Arena 0:
system bytes     =     135168
in use bytes     =      74352
Total (incl. mmap):
system bytes     =     135168
in use bytes     =      74352
max mmap regions =          1
max mmap bytes   =   10489856
(gdb) p 74352-73312
$1 = 1040
(gdb) c
Continuing.
[Inferior 1 (process 22209) exited normally]
(gdb) p 74352-73312
$2 = 1040
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值