我一直在尝试使用valgrind和gdb调试一段代码。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *p = malloc(sizeof(int));
free(p);
return 0;
}
我已经使用命令gcc prog.c -o prog -g
对其进行了编译。当我跑步与gdb和valgrind一起使用,效果很好。
然后我通过命令strip --strip-all
prog
删除了调试符号。
此外,在两种情况下,我都尝试使用命令size
检查大小。但是我找不到任何区别。
如何查找是否已添加调试信息?如何在没有调试符号和可执行文件的情况下使用valgrind查找泄漏检查?
如何查找是否已添加调试信息?
最简单的方法可能是使用file
实用程序。示例:
file my_executable
其中提供的信息是调试符号是否存在或是否已被剥离。
[还有其他各种工具也可以做到这一点,其中包括GNU readelf(用于ELF可执行文件)。调试信息将显示在ELF二进制文件的一个或多个单独部分中,您将在部分列表中看到这些信息。
如何在没有调试符号和可执行文件的情况下使用valgrind查找泄漏检查?
完全可以通过相同的方式运行程序而无需调试符号。 Valgrind不需要调试信息即可监视程序行为。它的主要钩子是提供自己的特殊malloc()
和free()
实现。有了调试信息就可以使其发出更多人类可理解的诊断消息,毕竟,调试消息的重点就在于此。
在一定程度上,您也可以使用gdb调试程序而无需调试符号,但是这很痛苦,因为您通常希望使用调试器进行的大部分操作都取决于将可执行文件的详细信息映射回源代码。没有调试符号,这种映射几乎是不可能的。