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
作为调试器(也许gdb
的watch
命令可能很有用)。
可能发生的是你错误地在堆malloc
-ed内存区域外覆盖了一些单词,或者得到了缓冲区溢出 ,或者使用了未初始化的变量等等……
使malloc
陷入困境的好方法是在一些malloc
-ed区域之前编写,如int *p = malloc(4); p[-1]=1234;
int *p = malloc(4); p[-1]=1234;
然后未来的free
和malloc
可能表现出非常奇怪的行为……
你应该使用valgrind来捕获你的内存错误。 试试跑步
valgrind yourprogram
your-program-arguments ….
使用最近的GCC(即4.8),您还可以尝试使用-fsanitize = address选项进行编译和链接(除-Wall -g
)