C - Valgrind не показывает номер строки кода, скомпилированного Makefile - PullRequest
0 голосов
/ 31 января 2019

Я использую Makefile для компиляции своего кода на C. Но когда я пытаюсь использовать для него valgrind, я не вижу следа утечки:

Вот мой Makefile:

SRC     =       main.c

OBJ     =       $(SRC:.c=.o)

NAME    =       valgrind_check

all:    $(NAME)

$(NAME):        $(OBJ)
        gcc -g -o $(NAME) $(OBJ)

Вот как я запускаю valgrind:

make
cc -c -o main.o main.c
gcc -g -o valgrind_check main.o
valgrind --track-origins=yes --leak-check=full ./valgrind_check

Теперь результат:

==13934== Memcheck, a memory error detector
==13934== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==13934== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==13934== Command: ./valgrind_check
==13934== 
==13934== Conditional jump or move depends on uninitialised value(s)
==13934==    at 0x4E8B4A9: vfprintf (in /usr/lib64/libc-2.27.so)
==13934==    by 0x4E935F5: printf (in /usr/lib64/libc-2.27.so)
==13934==    by 0x400501: bad_function (in /home/mrabaud/Repository/Valgrind/valgrind_check)
==13934==    by 0x400524: main (in /home/mrabaud/Repository/Valgrind/valgrind_check)
==13934==  Uninitialised value was created by a stack allocation
==13934==    at 0x4004E6: bad_function (in /home/mrabaud/Repository/Valgrind/valgrind_check)
==13934== 
==13934== Use of uninitialised value of size 8
==13934==    at 0x4E8792E: _itoa_word (in /usr/lib64/libc-2.27.so)
==13934==    by 0x4E8B225: vfprintf (in /usr/lib64/libc-2.27.so)
==13934==    by 0x4E935F5: printf (in /usr/lib64/libc-2.27.so)
==13934==    by 0x400501: bad_function (in /home/mrabaud/Repository/Valgrind/valgrind_check)
==13934==    by 0x400524: main (in /home/mrabaud/Repository/Valgrind/valgrind_check)
==13934==  Uninitialised value was created by a stack allocation
==13934==    at 0x4004E6: bad_function (in /home/mrabaud/Repository/Valgrind/valgrind_check)
==13934== 

Как видите, отслеживание вообще не помогает.

Вот результат, если я запускаю код без make-файла:

gcc -g -o valgrind_check main.c 
valgrind --track-origins=yes --leak-check=full ./valgrind_check


==14056== Memcheck, a memory error detector
==14056== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==14056== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==14056== Command: ./valgrind_check
==14056== 
==14056== Conditional jump or move depends on uninitialised value(s)
==14056==    at 0x4E8B4A9: vfprintf (in /usr/lib64/libc-2.27.so)
==14056==    by 0x4E935F5: printf (in /usr/lib64/libc-2.27.so)
==14056==    by 0x400501: bad_function (main.c:14)
==14056==    by 0x400524: main (main.c:22)
==14056==  Uninitialised value was created by a stack allocation
==14056==    at 0x4004E6: bad_function (main.c:11)
==14056== 
==14056== Use of uninitialised value of size 8
==14056==    at 0x4E8792E: _itoa_word (in /usr/lib64/libc-2.27.so)
==14056==    by 0x4E8B225: vfprintf (in /usr/lib64/libc-2.27.so)
==14056==    by 0x4E935F5: printf (in /usr/lib64/libc-2.27.so)
==14056==    by 0x400501: bad_function (main.c:14)
==14056==    by 0x400524: main (main.c:22)
==14056==  Uninitialised value was created by a stack allocation
==14056==    at 0x4004E6: bad_function (main.c:11)

Как я могу это исправить?У меня нет выбора, я должен использовать Makefile.

Любая помощь будет очень признательна.У меня есть этот вопрос в этом месяце, но ничего не нашел ...

1 Ответ

0 голосов
/ 31 января 2019

Вы не включили правило о том, как создать файл .o, поэтому было использовано правило по умолчанию.Это правило по умолчанию не компилировало main.c с флагом -g, поэтому вы не получите отладочной информации.

Добавьте правило для .o, чтобы разобрать это:

%.o: %.c
    gcc -g -c $<
...