2012-03-23 5 views
15

Я пытаюсь скомпилировать программу с отладочными символами, чтобы valgrind дал мне номера строк. Я обнаружил, что если я скомпилирую простую тестовую программу за один раз (с -g), то она содержит символы. Однако, если я скомпилирую за два прохода (т. Е. Скомпилирую ссылку), то он не содержит отладочных символов.Отладка символов, потерянных при связывании?

Вот команда компиляции для одного случая прохода:

g++ -g file.c -o file 

И за два прохода

g++ -g -c file.c -o file.o 
g++ -g file.o -o file 

Реальная программа выглядит следующим образом и содержит простой Invalid Write

int main(){ 
    int* x = new int[10]; 
    x[10]=1; 

}

Если я скомпилировать один проход, то Valgrind дает следующее (обратите внимание на номер строки в конце)

==24114== 40 bytes in 1 blocks are definitely lost in loss record 2 of 9 
==24114== at 0xB823: malloc (vg_replace_malloc.c:266) 
==24114== by 0x5768D: operator new(unsigned long) (in /usr/lib/libstdc++.6.0.9.dylib) 
==24114== by 0x576DA: operator new[](unsigned long) (in /usr/lib/libstdc++.6.0.9.dylib) 
==24114== by 0x100000F09: main (file.c:3) 

а если я компилирую в два прохода, я получаю это (без номера строки):

==24135== 40 bytes in 1 blocks are definitely lost in loss record 2 of 9 
==24135== at 0xB823: malloc (vg_replace_malloc.c:266) 
==24135== by 0x5768D: operator new(unsigned long) (in /usr/lib/libstdc++.6.0.9.dylib) 
==24135== by 0x576DA: operator new[](unsigned long) (in /usr/lib/libstdc++.6.0.9.dylib) 
==24135== by 0x100000F09: main (in ./file) 

Любое понимание этого было бы высоко оценено. Я использую gcc версии 4.2.1 на OS X 10.7.3

+1

Имеет ли Clang такое же поведение? – rubenvb

+1

Я предполагаю, что что-то должно сломаться на вашей инструментальной цепочке. На ubuntu (gcc 4.6.1) valgrind (3.6.1) показывает номера строк для обоих методов компиляции. – dbrank0

+1

Вы можете отлаживать второй метод с помощью gdb шаг за шагом? – ks1322

ответ

2

Просто для того, чтобы отметить этот вопрос как «ответил» (поэтому его не нужно открывать и читать другими).

=> Ответ можно найти в качестве комментария от пользователя user1288111 к исходному вопросу.

8

Заключительное замечание - это действительно особенность OS X, связанная с тем, как OS X связывает отладочную информацию. Valgrind помогает пользователю обойти проблему с помощью команды --dsymutil=yes.

Вы можете прочитать об этом здесь: http://valgrind.org/docs/manual/manual-core.html#manual-core.erropts

Кредит на Дэйва Гуделла, который послал мне решение на форуме пользователей, valgrind.