2015-07-01 3 views
2

Я сделал ошибку памяти, которую довольно сложно отлаживать, что происходит каждый раз в нескольких прогонах командной строки, каждый из которых занимает около двух часов. Из-за этого, я думал, что это может быть хорошей идеей для создания журналов, как это:Как автоматически подключиться к процессу, управляемому valgrind изнутри gdb?

while true; do 
    valgrind ./command 2>&1 | tee command 
    grep -q Invalid && break 
done 

Проблема заключается в том, что мои журналы отладки и трассировки стека, производимые Valgrind не хватает, поэтому я решил добавить к --vgdb-error=0 командной строки. К сожалению, так как Valgrind теперь добавляет контрольную точку при запуске, мне нужно выполнить следующую команду:

$ gdb ./command 
...gdb init string follows... 
(gdb) target remote | /usr/lib/valgrind/../../bin/vgdb 
Remote debugging using | /usr/lib/valgrind/../../bin/vgdb 
relaying data between gdb and process 4361 
Reading symbols from /lib/ld-linux.so.2...(no debugging symbols found)...done. 
Loaded symbols for /lib/ld-linux.so.2 
[Switching to Thread 4361] 
0x04000840 in ??() from /lib/ld-linux.so.2 
(gdb) continue 
Continuing. 

Как я могу сценарий процесс так, что либо Valgrind не ломается при запуске или скрипт продолжает прикрепляться к vgdb процессов и сказать их продолжать, пока один из процессов не завершится ненормально?

+0

Если все идет хорошо, я получаю «Удаленное соединение закрыто» после 'continue'. – d33tah

+1

Почему бы не использовать --vgdb-error = 1, а затем прикрепить отладчик после ошибок? – bonsaiviking

ответ

2

Аргумент --vgdb-error - это количество ожидаемых ошибок, прежде чем valgrind остановит программу и присоединяет отладчик. Если вы установите его на 0, он будет остановлен сразу перед запуском вашей программы. Вы хотите --vgdb-error=1, который будет работать до первой ошибки, а затем остановится. Затем вы можете подключить отладчик.

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