gnu gdb malloc返回不可访问的指针

运行一些代码后,gdb调试会话中的malloc返回不可访问的地址。

首先在主要function开始时rest。 一切都好。

Breakpoint 9, main (argc=5, argv=0x7fffffffe418) at src/ose/sdv/ose_sdv/linux/main.c:557 557 char *cfgfile = NULL; (gdb) call malloc(4) $50 = 23293968 (gdb) x 23293968 0x1637010: 0x00000000 (gdb) c 

在运行一些行后,它开始返回无法访问的内存地址,该地址从0xffffffff~开始

 Program received signal SIGINT, Interrupt.0x00007ffff70c1f4d in read () from /lib64/libc.so.6 (gdb) call malloc(4) $52 = -1811110576 (gdb) x -1811110576 0xffffffff940ca550: Cannot access memory at address 0xffffffff940ca550 

我正在使用64位Linux操作系统。

我找不到导致这种情况的确切代码行。

malloc开始喜欢这个的行总是改变。

运行期间没有exception,程序按预期运行。 我不确定这里有什么问题。

你的程序中 bug 。 C ++中的错误并不总是提供exception,而C没有exception概念。 阅读有关未定义的行为 。

gdb下键入call malloc(4) ,请让gdb在你的buggy进程中调用malloc

malloc (或new )可能在一次运行中给出不同地址的原因是ASLR 。 如果您愿意,可以禁用ASLR

  echo 0 > /proc/sys/kernel/randomize_va_space 

您应该使用gcc -Wall -g编译并使用gdb作为调试器(也许gdbwatch命令可能很有用)。

可能发生的是你错误地在堆malloc -ed内存区域外覆盖了一些单词,或者得到了缓冲区溢出 ,或者使用了未初始化的变量等等……

使malloc陷入困境的好方法是在一些malloc -ed区域之前编写,如int *p = malloc(4); p[-1]=1234; int *p = malloc(4); p[-1]=1234; 然后未来的freemalloc可能表现出非常奇怪的行为……

你应该使用valgrind来捕获你的内存错误。 试试跑步

valgrind yourprogram your-program-arguments ….

使用最近的GCC(即4.8),您还可以尝试使用-fsanitize = address选项进行编译和链接(除-Wall -g