Не видеть номера строк при использовании Valgrind внутри Ubuntu (Vagrant + Virtualbox)

В настоящее время я читаю и слежу за книгой "Learn C The Hard Way". В упражнении 4 мне нужно установить Valgrind. Сначала я сделал это локально на своем Macbook с Maverick, но получил предупреждение о том, что Valgrind может работать не на 100%.

Итак, теперь я попробовал это с Vagrant (используя VirtualBox) с коробкой Ubuntu 12.04. Вы можете проверить точный файл Vagrantfile (установка) и файлы упражнений здесь, в моем репозитории github.

Проблема:
я не вижу номеров строк, а вместо этого получаю что-то вроде 0x40052B.

Я скомпилировал файлы, выполнив следующие действия:

$ make clean # Just to be sure
$ make
$ valgrind --track-origins=yes ./ex4

Я вставил результат в сюда.

Я нашел следующие 3 вопроса по SO, которые (частично) описывают ту же проблему, но ответ и решения не сработали для меня:

Что я пробовал софар:

  • Добавлено libc6-dbg
  • установил gcc и попробовал компилировать с этим вместо cc.
  • добавил --track-origins=yes в valgrind-команду
  • Добавлена ​​(а позже удалена) компиляция с флагами -static и -oO

Так что я не уверен, что делать дальше? Я мог попробовать установить последнюю версию (вместо v3.7) с gcc вручную, хотя это выглядело довольно сложно.

edit:
ответ @abligh кажется правильным. Я сделал это с помощью калейдоскопа: введите описание изображения здесьСлева вы видите результат: valgrind --track-origins=yes ./ex4 и на справа результат valgrind ./ex4.

Думаю, мне все еще нужно изучить c и его инструменты.


person Ilyes512    schedule 18.03.2014    source источник
comment
Какие параметры передаются в gcc при компиляции программ? -g там?   -  person ldx    schedule 19.03.2014
comment
Да ... Все внутри моего репо. Вы можете проверить Makefile здесь, vagrantfile и остальную часть c- файлы.   -  person Ilyes512    schedule 19.03.2014


Ответы (1)


Я думаю, вам их просто не хватает на выходе.

Вот некоторые из ваших результатов (скопированы из Pastebin):

==16314==    by 0x40052B: main (ex4.c:9)
                                     ^^--- LINE NUMBER
==16314==  Uninitialised value was created by a stack allocation
==16314==    at 0x4004F4: main (ex4.c:4)
                                     ^^--- LINE NUMBER

Хотя я думаю, что ваш вызов неверен для проверки утечек памяти. Я написал очень простую программу для утечки одного элемента:

#include <stdio.h>
#include <stdlib.h>

int
main (int argc, char **argv)
{
  void *leak;
  leak = malloc (1);
  printf ("Leaked %p\n", leak);
  exit (0);
}

и скомпилировал его с помощью вашего Makefile:

gcc -Wall -g    test.c   -o test

Выполнение вашей команды:

$ valgrind --track-origins=yes ./test
==26506== Memcheck, a memory error detector
==26506== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==26506== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==26506== Command: ./test
==26506== 
Leaked 0x51f2040
==26506== 
==26506== HEAP SUMMARY:
==26506==     in use at exit: 1 bytes in 1 blocks
==26506==   total heap usage: 1 allocs, 0 frees, 1 bytes allocated
==26506== 
==26506== LEAK SUMMARY:
==26506==    definitely lost: 0 bytes in 0 blocks
==26506==    indirectly lost: 0 bytes in 0 blocks
==26506==      possibly lost: 0 bytes in 0 blocks
==26506==    still reachable: 1 bytes in 1 blocks
==26506==         suppressed: 0 bytes in 0 blocks
==26506== Rerun with --leak-check=full to see details of leaked memory
==26506== 
==26506== For counts of detected and suppressed errors, rerun with: -v
==26506== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)

Но вызывая способ, которым я обычно вызываю его:

$ valgrind --leak-check=full --show-reachable=yes ./test
==26524== Memcheck, a memory error detector
==26524== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==26524== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==26524== Command: ./test
==26524== 
Leaked 0x51f2040
==26524== 
==26524== HEAP SUMMARY:
==26524==     in use at exit: 1 bytes in 1 blocks
==26524==   total heap usage: 1 allocs, 0 frees, 1 bytes allocated
==26524== 
==26524== 1 bytes in 1 blocks are still reachable in loss record 1 of 1
==26524==    at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==26524==    by 0x40059C: main (test.c:8)
==26524== 
==26524== LEAK SUMMARY:
==26524==    definitely lost: 0 bytes in 0 blocks
==26524==    indirectly lost: 0 bytes in 0 blocks
==26524==      possibly lost: 0 bytes in 0 blocks
==26524==    still reachable: 1 bytes in 1 blocks
==26524==         suppressed: 0 bytes in 0 blocks
==26524== 
==26524== For counts of detected and suppressed errors, rerun with: -v
==26524== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)

Обратите внимание, что номера строк снова в скобках, например

==26524==    by 0x40059C: main (test.c:8)
                                ^^^^^^^^ <- FILENAME AND LINE NUMBER
person abligh    schedule 18.03.2014
comment
Я думаю ты прав! Блин, я думал, что этих шестнадцатеричных здесь быть не должно. Спасибо! Я приму твой ответ, когда смогу. Изменить: Ой, я вижу, я могу принять это сразу ^^ - person Ilyes512; 19.03.2014