2013-03-22 2 views
1

Я просто начинаю использовать valgrind.I открываю ubuntu как часть vmWare, и я просто сделал программу ac, которая должна показывать ошибки valgrind и запускать valgrind на a. , но я не в состоянии видеть номера строк, чтобы быть видимыми на выходе: команда используется:Использование Valgrind в программе C

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

Покажите нам команду, используемую для компиляции кода. –

+2

Вы скомпилировали программу с отладочной информацией? Для этого используйте флаг '-g' для GCC. –

+0

cc bc - команда, а команда valgrind - valgrind --leak-check = full --track-originins = yes ./a.out – Maddy

ответ

4

Вы должны построить программу с отладочной информацией, для GCC, вы должны быть в состоянии сделать что-то вроде этого:

gcc -g -O0 -Wall sourcefile.c 

Valgrind затем покажет вам номера строк и имена функций из вашего источника.

+1

Я могу добавить, что часто бывает разумно отключить оптимизацию компилятора, так как это может привести к тому, что отношения с исходными строками очень запутывают время от времени ... CFLAGS = "- g -O0 -Wall «Это хорошая идея при попытке отладки и/или использования valgrind (предположим, что вы используете компилятор gcc, например) –

+0

@KScottPiel, я согласен с этим, обновляю ответ ... – harald

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 
+0

@Valeri ... Можете ли вы сделать это более ясно? – Maddy

+1

«Я предполагаю, что вы использовали' -g' »- если бы он это сделал, Valgrind показал бы его номера строк без использования' addr2line'. Поскольку Вальгринд не сделал этого, нужно предположить, что он этого не сделал; создание 'addr2line' также бесполезно. –

+0

@EmployedRussian addr2line может использоваться после получения результатов выполнения. Даже если исходный исполняемый файл не имел отладочных символов, инструмент можно использовать с новой сборкой. Не всегда, но во многих случаях это возможно –

Смежные вопросы