我有一个我编译的 C 程序(很多数字而且太长无法发布)
gcc -g -O0 program.c -o program
我正在尝试使用 gdb 和 valgrind memcheck 对其进行调试。在对代码进行一些更改后,我发现
valgrind --tool=memcheck --log-file=output.log ./program
给
==15866== Memcheck, a memory error detector
==15866== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==15866== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==15866== Command: ./program
==15866== Parent PID: 3362
==15866==
==15866== Warning: client switching stacks? SP change: 0xbe88bcd8 --> 0xbe4e1f70
==15866== to suppress, use: --max-stackframe=3841384 or greater
==15866== Invalid write of size 4
==15866== at 0x804B7BE: main (program.c:1396)
==15866== Address 0xbe4e1f74 is on thread 1's stack
==15866==
==15866== Invalid write of size 4
==15866== at 0x804B7C2: main (program.c:1396)
==15866== Address 0xbe4e1f70 is on thread 1's stack
==15866==
==15866== Invalid read of size 4
==15866== at 0x4320011: on_exit (on_exit.c:34)
==15866== by 0x43064D2: (below main) (libc-start.c:226)
==15866== Address 0xbe4e1f70 is on thread 1's stack
==15866==
==15866== Invalid read of size 4
==15866== at 0x4320022: on_exit (on_exit.c:37)
==15866== by 0x43064D2: (below main) (libc-start.c:226)
==15866== Address 0xbe4e1f74 is on thread 1's stack
以及更多此类。
valgrind --tool=memcheck --max-stackframe=3841384 --log-file=output.log ./program
不打印任何错误。但令我困惑的是,两个 valgrind 调用程序都会提前退出(没有错误消息)并且不执行它应该执行的计算。具有相同编译器选项但在没有 valgrind 的情况下运行的行为完全不同,看起来很正常。但是我怀疑是内存错误,并想使用 valgrind 来查找它。因此,我的问题是:当使用 valgrind 执行程序时,什么样的错误会使程序变得如此不同?如果这些是与内存相关的错误,我该如何识别它?请注意,我很清楚我可以“手动调试”来定位它。但是我可以用 valgrind 运行 gdb 来查看它的退出位置。