1

私は valgrind の使い方の初心者です。vmWare の一部として ubuntu を開き、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 です。

4

2 に答える 2

4

デバッグ情報を使用してプログラムをビルドする必要があります。gcc の場合、次のようなことができるはずです。

gcc -g -O0 -Wall sourcefile.c

Valgrind は、ソースからの行番号と関数名を表示します。

于 2013-03-22T11:53:29.530 に答える
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
于 2013-03-22T11:56:11.673 に答える