Сделайте остановку valgrind сразу после первой ошибки - PullRequest
16 голосов
/ 13 мая 2011

моя программа обрабатывает большие ошибки и во время разработки выдает большое количество вывода на консоль. Он страдает от повреждения памяти, и я пытаюсь использовать valgrind, чтобы найти ошибку.

К сожалению, я не могу найти сообщения об ошибках в выходных строках, и они слишком быстро сбрасываются, чтобы отменить выполнение, когда они всплывают. Они должны быть там, чтобы найти ошибку (какой элемент вызывает ошибку и т. Д.). Тогда перенаправление в моей программе не работает, точно так же, как конвейеризация вывода только перенаправляет вывод программы, а не вывод valgrind.

Можете ли вы дать мне подсказку, как решить эту проблему.

Ответы [ 5 ]

21 голосов
/ 16 мая 2011

Помимо перенаправления вывода программы и Valgrind в файл (как уже предлагалось), вы можете использовать флаг --db-attach=yes, который заставит вашу программу остановиться в отладчике прямо при ошибке.

Это имеет то преимущество, что помимо просмотра журнала, созданного вашей программой, вы также можете просматривать другое состояние программы (что вы не регистрируетесь).

12 голосов
/ 18 марта 2016

Если вы хотите остановить его в консоли (не в файле), вот способ сделать это:

Используйте параметр: --gen-suppressions=yes

Когда вы отлаживаете егоостановится следующим образом:

==949== Thread 2:
==949== Invalid read of size 4
==949==    at 0x7B62DC0: wcslen (wcslen.S:24)
==949==    by 0x7B62D7D: wcsdup (wcsdup.c:29)
==949==    by 0x52D0476: de_strdup(wchar_t*) (de_string.cpp:1442)
==949==    by 0x437629: void de_format<>(c_de_string&, wchar_t*) (de_string.h:368)
==949==    by 0x45F4FB: int db_select_group<>(s_db*, s_pqexec_param*, wchar_t*, wchar_t*, wchar_t*, wchar_t*, int, wchar_t*) (in /corto/goinfre/code2/cortod.repo/bin/x64/Debug/cortod)
==949==    by 0x45EA96: check_oldgeom(c_cartod*) (cartod_funcs.cpp:114)
==949==    by 0x45EBF8: armserv_update_geom(c_cartod*) (cartod_funcs.cpp:149)
==949==    by 0x455EF9: c_cortosrv_thread::on_timeout() (cartod.cpp:163)
==949==    by 0x52FE500: c_de_thread::loop() (de_thread.cpp:35)
==949==    by 0x52FEE97: thread_loop(void*) (de_thread_priv_linux.cpp:85)
==949==    by 0x506E181: start_thread (pthread_create.c:312)
==949==    by 0x7BBA47C: clone (clone.S:111)
==949==  Address 0x0 is not stack'd, malloc'd or (recently) free'd
==949== 
==949== 
==949== ---- Print suppression ? --- [Return/N/n/Y/y/C/c] ---- 

Затем вы можете перейти к следующему, продолжить все и т.д.

Обычная цель этого параметра - удалить ложные срабатывания, печатая подавление,можно добавить в файл и передать его в valgrind с помощью параметра: --suppressions=<filename>

3 голосов
/ 13 мая 2011

Valgrind выводит в stderr (fd 2) по умолчанию. Вы можете захватить stderr, перенаправив дескриптор файла 2:

# Output to log file.
valgrind [options] > valgrind.log 2>&1

# View output interactively.
valgrind [options] 2>&1 | less

Или вы можете использовать опцию --log-fd, чтобы изменить место отправки вывода:

valgrind [options] --log-fd=1 > valgrind.log
valgrind [options] --log-fd=1 | less
2 голосов
/ 13 мая 2011

Вы можете попросить valgrind сохранить его вывод в файл:

valgrind --log-file=<filename>

где <filename> - имя файла для вывода. Позже вы можете просмотреть этот файл с помощью less или текстового редактора.

1 голос
/ 11 мая 2018

Valgrind 3.13.0 имеет эту опцию:

ERROR-RELATED OPTIONS         top

       These options are used by all tools that can report errors, e.g.
       Memcheck, but not Cachegrind.

   ...

   --exit-on-first-error=<yes|no> [default: no]
       If this option is enabled, Valgrind exits on the first error. A
       nonzero exit value must be defined using --error-exitcode option.
       Useful if you are running regression tests or have some other
       automated test machinery.
...