0

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 开始喜欢这个的那一行总是变化。

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

4

1 回答 1

1

程序错误。C++ 中的错误并不总是给出异常,并且 C 没有异常的概念。阅读未定义的行为

当你在下面输入时call malloc(4)gdb你要求在你的错误进程gdb中调用。malloc

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

 echo 0 > /proc/sys/kernel/randomize_va_space

您应该使用调试器进行编译gcc -Wall -g和使用gdb(也许 的watch命令gdb可能有用)。

可能发生的情况是您错误地覆盖了堆malloc内存区域之外的某些单词,或者出现缓冲区溢出,或者使用了未初始化的变量等......

一个非常糟糕的好方法是在一些-ed 区域malloc之前写,比如then future并且可能表现出非常奇怪的行为......mallocint *p = malloc(4); p[-1]=1234;freemalloc

你应该使用valgrind来寻找你的内存错误。尝试运行

valgrind yourprogram 你的程序参数....

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

于 2013-05-25T06:47:59.193 回答