gnu gdb malloc返回无法访问的指针

时间:2013-05-25 06:28:40

标签: c linux gdb malloc gnu

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

首先在main函数的开头打破。 一切都好。

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开始喜欢这样的行总是改变。

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

1 个答案:

答案 0 :(得分:1)

你的程序中有 错误。 C ++中的错误并不总是提供异常,而C没有exceptions的概念。阅读undefined behavior

call malloc(4)下输入gdb时,您要求gdb在您的错误流程中调用malloc

malloc(或new)可能会为一次运行提供不同地址的原因是ASLR。如果您想通过

,可以禁用ASLR
 echo 0 > /proc/sys/kernel/randomize_va_space

您应该使用gcc -Wall -g进行编译并使用gdb作为调试器(可能watch的{​​{1}}命令可能很有用)。

可能发生的是你错误地覆盖了堆gdb - 内存区域之外的某个单词,或者得到了buffer overflow,或者使用了未初始化的变量等等......

混淆malloc非常糟糕的一个好方法是在某个malloc区域之前写一下malloc,然后是int *p = malloc(4); p[-1]=1234;free可能表现出非常奇怪的行为......

你应该用valgrind来追捕你的记忆错误。尝试运行

malloc 你的程序参数 ....

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