我只是初学者使用valgrind。我已经打开ubuntu作为vmWare的一部分,我刚刚制作了应该显示valgrind错误的ac程序并且在a.out上运行了valgrind,但我无法看到输出上可见的行号: 使用的命令是:
valgrind --leak-check=full --track-origins=yes ./a.out
对于C程序如下所示:
#include <stdlib.h>
#define ARRAY_SIZE (5)
typedef char TEST_TYPE;
void invalid_write(TEST_TYPE* array, int size)
{
array[size] = 5;
}
int main(void)
{
TEST_TYPE static_array[ARRAY_SIZE];
TEST_TYPE* dynamic_array = NULL;
TEST_TYPE* p = NULL;
TEST_TYPE i;
dynamic_array = (TEST_TYPE*)malloc(ARRAY_SIZE * sizeof(TEST_TYPE));
/* ERROR 1 : Writing out of array boundaries (heap overrun) */
invalid_write(dynamic_array, ARRAY_SIZE);
}
输出如下所示:
==6801== Memcheck, a memory error detector
==6801== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==6801== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==6801== Command: ./a.out
==6801==
==6801== Invalid write of size 1
==6801== at 0x80483ED: invalid_write (in /home/jci/a.out)
==6801== by 0x804842E: main (in /home/jci/a.out)
==6801== Address 0x419702d is 0 bytes after a block of size 5 alloc'd
==6801== at 0x4026444: malloc (vg_replace_malloc.c:263)
==6801== by 0x8048416: main (in /home/jci/a.out)
==6801==
==6801==
==6801== HEAP SUMMARY:
==6801== in use at exit: 5 bytes in 1 blocks
==6801== total heap usage: 1 allocs, 0 frees, 5 bytes allocated
==6801==
==6801== 5 bytes in 1 blocks are definitely lost in loss record 1 of 1
==6801== at 0x4026444: malloc (vg_replace_malloc.c:263)
==6801== by 0x8048416: main (in /home/jci/a.out)
==6801==
==6801== LEAK SUMMARY:
==6801== definitely lost: 5 bytes in 1 blocks
==6801== indirectly lost: 0 bytes in 0 blocks
==6801== possibly lost: 0 bytes in 0 blocks
==6801== still reachable: 0 bytes in 0 blocks
==6801== suppressed: 0 bytes in 0 blocks
==6801==
==6801== For counts of detected and suppressed errors, rerun with: -v
==6801== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 11 from 6)
我应该如何得到这些错误的行号,以便我们能准确指出问题所在?目前使用的valgrind版本是3.7.0。
答案 0 :(得分:4)
您需要使用调试信息构建程序,对于gcc,您应该可以执行以下操作:
gcc -g -O0 -Wall sourcefile.c
然后,Valgrind将向您显示来源的行号和功能名称。
答案 1 :(得分:0)
您可以使用addr2line工具。
addr2line --exe a.out 8048416
我假设您在构建对象时使用了-g
标志:
gcc -c -g my_source1.c -o mysource1.o
gcc -c -g my_source2.c -o mysource2.o
gcc mysource1.o mysource2.o -o myapp
或者:
gcc -g my_source1.c my_source2.c -o myapp