程序正常失败,但在 Valgrind 中不会
Program fails normally, but not in Valgrind
我在调试用 C11 编写的应用程序时遇到过这个问题。我阅读了其他相关的堆栈帖子,但其中 none 解决了我的问题。我的代码包含一个 'safe malloc' 实现,如下所示:
void *try_malloc(size_t size) {
void *mem = malloc(size);
if (!mem) { perror("Error: unable to allocate memory"); exit(1); }
return mem;
}
我编译它:
gcc -Wall -Wextra -std=c11 -ggdb -o main
然后当我 运行 它带有:./main < inp.in
时,它显然有内存问题并输出“错误:无法分配内存:无法分配内存”并以代码 1 退出。当我 运行 它与 valgrind ./main < inp.in
,valgrind 报告没有警告或错误,报告没有内存泄漏是可能的,程序打印正确的输出。
为了方便,我写了一个简单的测试脚本:
$ cat ttest.sh
./main < inp.in
当我运行 valgrind like: valgrind ./ttest.sh
时,再次出现与上面相同的问题,这是“Error: unable to allocate memory: Cannot allocate memory”,但是valgrind无法产生一个有意义的跟踪并且没有给我任何关于问题发生原因的信息。 Inp.in
是一个大文件,我的程序应该使用大量内存来处理它。对于较小的输入文件,不会发生内存错误。我在 Debian 的环境 运行 在 WSL2.
- 如何调试它?
- 为什么 Valgrind 中的程序 运行 可以正常运行?
- 如何设置 Valgrind 以便重现分配错误?
- 这可能是某种竞争条件? (虽然我没有使用任何线程等,代码没有任何异步)
- 会不会是WSL限制了子进程的内存?如何查看?
@编辑:
Valgrind 对程序执行环境的影响抑制了该问题。我将尝试找出 Valgrind 究竟如何影响 env 以尝试重现问题并可能提供 MRE
我解决了问题 - 错误在我的代码中(我忘记在重新分配指针指向的数据结构后更新指针)。但是,我无法回答为什么程序在 Valgrind
中没有失败的问题
我在调试用 C11 编写的应用程序时遇到过这个问题。我阅读了其他相关的堆栈帖子,但其中 none 解决了我的问题。我的代码包含一个 'safe malloc' 实现,如下所示:
void *try_malloc(size_t size) {
void *mem = malloc(size);
if (!mem) { perror("Error: unable to allocate memory"); exit(1); }
return mem;
}
我编译它:
gcc -Wall -Wextra -std=c11 -ggdb -o main
然后当我 运行 它带有:./main < inp.in
时,它显然有内存问题并输出“错误:无法分配内存:无法分配内存”并以代码 1 退出。当我 运行 它与 valgrind ./main < inp.in
,valgrind 报告没有警告或错误,报告没有内存泄漏是可能的,程序打印正确的输出。
为了方便,我写了一个简单的测试脚本:
$ cat ttest.sh
./main < inp.in
当我运行 valgrind like: valgrind ./ttest.sh
时,再次出现与上面相同的问题,这是“Error: unable to allocate memory: Cannot allocate memory”,但是valgrind无法产生一个有意义的跟踪并且没有给我任何关于问题发生原因的信息。 Inp.in
是一个大文件,我的程序应该使用大量内存来处理它。对于较小的输入文件,不会发生内存错误。我在 Debian 的环境 运行 在 WSL2.
- 如何调试它?
- 为什么 Valgrind 中的程序 运行 可以正常运行?
- 如何设置 Valgrind 以便重现分配错误?
- 这可能是某种竞争条件? (虽然我没有使用任何线程等,代码没有任何异步)
- 会不会是WSL限制了子进程的内存?如何查看?
@编辑: Valgrind 对程序执行环境的影响抑制了该问题。我将尝试找出 Valgrind 究竟如何影响 env 以尝试重现问题并可能提供 MRE
我解决了问题 - 错误在我的代码中(我忘记在重新分配指针指向的数据结构后更新指针)。但是,我无法回答为什么程序在 Valgrind
中没有失败的问题