0

自从我使用 Valgrind 而不是快速测试以来已经有一段时间了,在尝试调试用 C 编写的程序时,我遇到了一些我不太理解的东西。我不确定我的代码是否有问题或只是一些我不知道的“低级”。

正在执行以下代码(数据是一个结构):

... 
data = initialise();
setup(data);
printf("Hi2");
evolve(data);
...

设置结束的地方

    ...
    printf("Setup done.\n");
    printf("Hi1");
}

但是 Valgrind 用什么打印

valgrind --vgdb=yes --track-origins=yes ./a.out config

是(在此之前,没有错误;所有数据的预设值都正确打印,没有问题。)

...
Setup done.
==3886== Use of uninitialised value of size 8
==3886==    at 0x402BF2: evolve (generic_evolution.c:25)
==3886==    by 0x400AD3: main (main.c:19)
==3886==  Uninitialised value was created by a stack allocation
==3886==    at 0x400B54: initialise (main.c:28)
==3886== 
==3886== Invalid write of size 4
==3886==    at 0x7FF0001C0: ???
==3886==    by 0x400AD3: main (main.c:19)
==3886==  Address 0xae00000007ff0004 is not stack'd, malloc'd or (recently) free'd
==3886== 
==3886== 
==3886== Process terminating with default action of signal 11 (SIGSEGV)
==3886==  General Protection Fault
==3886==    at 0x7FF0001C0: ???
==3886==    by 0x400AD3: main (main.c:19)
Hi1Hi2
...

在此之后,从 Evolution 打印出来的前几个 printfs 并且程序过早退出。如果我在没有 Valgrind 的情况下运行它,它会在“安装完成”之后立即崩溃并出现段错误,而不会打印 Hi1。更重要的是,如果我用 gdb 运行程序并执行

bt full

我不仅可以看到数据的内容,还可以看到在进化开始时声明的变量,即使设置似乎还没有“真正”完成。根据gdb,段错误是由我看不到的东西引起的(用-g编译;其他变量显示得很好):

Finished setup.

Program received signal SIGSEGV, Segmentation fault.
0x00007fffffffe200 in ?? ()
(gdb) bt full
#0  0x00007fffffffe200 in ?? ()
No symbol table info available.
...
(prints data and variables declared in evolve)

有没有人碰巧知道/能够猜到为什么在 setup 中的最后一个 printf 打印到 stdout 之前似乎在进化中发生了错误(并且在正常执行时,段错误发生在两个简单的 printfs 之间这样一个奇怪的地方) ?

4

0 回答 0