首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何查找导致"malloc():memory corruption: 0x00“的行

如何查找导致"malloc():memory corruption: 0x00“的行
EN

Stack Overflow用户
提问于 2018-03-23 14:13:08
回答 3查看 2.3K关注 0票数 1

我有一个项目,从以太网端口读取数据,并在it.The上运行一组算法,程序运行几个小时,然后产生下面显示的错误。

可以建议如何调试,找出引起错误的那一行吗?

代码语言:javascript
复制
   *** Error in `objs/x64Linux3gcc5.4.0/lidarToBoxes': malloc(): memory corruption: 0x00000000051fc640 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7f230dc167e5]
/lib/x86_64-linux-gnu/libc.so.6(+0x8213e)[0x7f230dc2113e]
/lib/x86_64-linux-gnu/libc.so.6(__libc_malloc+0x54)[0x7f230dc23184]
/usr/lib/nvidia-384/tls/libnvidia-tls.so.384.111(+0x24c0)[0x7f2304e6e4c0]

======= Memory map: ========
00400000-00dc6000 r-xp 00000000 08:03 38407960                           /home/sai/sai_workspace/avt_17_003/modules/lidarToBoxes/objs/x64Linux3gcc5.4.0/lidarToBoxes
00fc5000-00fcf000 r--p 009c5000 08:03 38407960                           /home/sai/sai_workspace/avt_17_003/modules/lidarToBoxes/objs/x64Linux3gcc5.4.0/lidarToBoxes
00fcf000-00fd5000 rw-p 009cf000 08:03 38407960                           /home/sai/sai_workspace/avt_17_003/modules/lidarToBoxes/objs/x64Linux3gcc5.4.0/lidarToBoxes
00fd5000-00ff0000 rw-p 00000000 00:00 0 
0220b000-0614a000 rw-p 00000000 00:00 0     
[heap]

7f22d0000000-7f22d0022000 rw-p 00000000 00:00 0 
7f22d0022000-7f22d4000000 ---p 00000000 00:00 0 
7f22d4000000-7f22d4021000 rw-p 00000000 00:00 0 
7f22d4021000-7f22d8000000 ---p 00000000 00:00 0 
7f22d8000000-7f22d8021000 rw-p 00000000 00:00 0 
7f22d8021000-7f22dc000000 ---p 00000000 00:00 0 
7f22dc000000-7f22dc07c000 rw-p 00000000 00:00 0 
7f22dc07c000-7f22e0000000 ---p 00000000 00:00 0 
7f22e0000000-7f22e0021000 rw-p 00000000 00:00 0 
7f22e0021000-7f22e4000000 ---p 00000000 00:00 0 
7f22e6ffe000-7f22e6fff000 ---p 00000000 00:00 0 
7f22e6fff000-7f22e77ff000 rwxp 00000000 00:00 0 
7f22e8000000-7f22e8021000 rw-p 00000000 00:00 0 
7f22e8021000-7f22ec000000 ---p 00000000 00:00 0 
7f22eeffe000-7f22eefff000 ---p 00000000 00:00 0 
7f22eefff000-7f22ef7ff000 rwxp 00000000 00:00 0 
7f22ef7ff000-7f22ef800000 ---p 00000000 00:00 0 
7f22ef800000-7f22f0000000 rwxp 00000000 00:00 0 
7f22f0000000-7f22f00a6000 rw-p 00000000 00:00 0 
7f22f00a6000-7f22f4000000 ---p 00000000 00:00 0 
7f22f4000000-7f22f4021000 rw-p 00000000 00:00 0 
7f22f4021000-7f22f8000000 ---p 00000000 00:00 0 
7f22f8000000-7f22f8021000 rw-p 00000000 00:00 0 
7f22f8021000-7f22fc000000 ---p 00000000 00:00 0 
7f22fc093000-7f22fc291000 rw-p 00000000 00:00 0 
7f22fc291000-7f22fc491000 rw-s 00000000 00:09 323133    
socket:[323133]

谢谢!

EN

回答 3

Stack Overflow用户

发布于 2018-06-14 18:58:50

基于第一条消息,某个特定竞技场的未排序块列表已损坏:

*错误在` `objs/x64Linux3gcc5.4.0/lidarToBoxes':malloc():内存损坏: 0x00000000051fc640 *

您可以通过它显示"malloc():内存损坏“而不是"malloc():内存损坏(快速)”的事实来看出这一点。消息末尾的值在不同的glibc版本中有所不同,但在您的特定情况下,您看到的是代码中的“牺牲品”值,如下所示:

代码语言:javascript
复制
while ( (victim = unsorted_chunks(av)->bk) != unsorted_chunks(av)) {
  bck = victim->bk;
  if (__builtin_expect (victim->size <= 2 * SIZE_SZ, 0)
      || __builtin_expect (victim->size > av->system_mem, 0))
    malloc_printerr (check_action, "malloc(): memory corruption",
                     chunk2mem (victim));
  size = chunksize(victim);

在我的特殊情况下,我从glibc-2.18/malloc/malloc.c获取了这一点,因为根据消息后有一个数字的事实,您的glibc版本似乎接近5.18,但这只是一个猜测。您的回溯指定"/lib/x86_64-linux-gnu/libc.so.6“作为库,这有点含糊,但如果您想找到更具体的信息,一种方法是这样做:

ls -l /lib/x86_64-linux-gnu/libc.so.6

输出可能会显示您的路径是一个符号链接,并且该链接的目标将提供更多信息。在这种情况下,我不认为你真的需要知道确切的版本,但如果你看到来自libc malloc的错误消息并想了解它的含义,那么拥有它将允许你下载匹配的glibc源代码。

因此,返回到该代码向您显示的是,“牺牲品”被设置为指向由av识别的竞技场的双向链表的最后一项。它还向您显示行尾的值来自“chunk2mem(受害者)”。在您的示例中,使用64位进程,宏chunk2mem将添加16,因此您可以将受害者的值重新构造为0x00000000051fc640-16 = 0x00000000051fc630。

您可以通过执行以下操作来查看受害者的情况:

x/4gx 0x00000000051fc630

显示的第二个值是受害者->大小的值。

如果您碰巧有一个核心转储,您可能可以使用免费的开源工具https://github.com/vmware/chap来收集更多信息,因为chap经常在启动时检测到此类损坏。要启动它,请使用:

chap核心-文件-路径

考虑到size字段损坏的可能性,了解列出的0x00000000051fc640之前的相邻分配是如何使用的也很有帮助。损坏可能是由于上一次分配的缓冲区溢出造成的。要查看上次分配的内容,请在chap提示符下键入show allocation 51fc630。如果chap告诉您给定的地址不是分配的一部分,请在chap提示符下使用describe 51fc630了解该分配可能是什么。

票数 2
EN

Stack Overflow用户

发布于 2018-03-23 14:33:02

在破坏valgrind之前,使用添加-ggdb3调试标志编译您的程序

代码语言:javascript
复制
gcc -o executable -std=c11 -Wall -ggdb3 main.c

要运行valgrind,请将可执行文件作为参数传递

代码语言:javascript
复制
valgrind --leak-check=full \
         --show-leak-kinds=all \
         --track-origins=yes \
         --verbose \
         --log-file=valgrind-out.txt \
         ./executable
票数 0
EN

Stack Overflow用户

发布于 2018-03-23 14:20:55

我使用valgrind来检测许多内存管理错误。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49443433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档