Как создать обратную трассировку?

Когда мои программы KDE аварийно завершают работу (что происходит довольно часто :(), я могу сгенерировать обратную трассировку постфактум (я думаю, что это не совсем постфактум, просто ошибки фиксируются и сохраняются) и использовать его для отправки отчета об ошибках, если У меня установлены символы отладки. Как это работает и как я могу добавить эту функцию в мои собственные программы?

Теперь у меня есть проблема с программой, написанной мной (на C ++), которая периодически прерывается, по-видимому, из-за неправильного управления памятью. Для меня крайне непрактично запускать программу под gdb потому что это крупномасштабное моделирование, которое требует нескольких часов для запуска, и сбой появляется только тогда, когда размер системы очень велик. Возможность автоматически выгружать следы в файл сэкономит мне много часов.

Я предполагаю, что это включает в себя упаковку в какой-то try{}catch(){} рутина, но как мне получить полезные следы от этого? Есть ли способ лучше? Все мои программы на Linux, если это влияет на ответ.

0

Решение

Вы не можете использовать try/catchпотому что те требуют правильный программа, и сбои вы испытываете, потому что ваша программа неправильно сформирована / неправильно / сломана. Обычно вы не можете использовать детерминированное программирование для обхода недетерминированного неработающего кода. Во-первых, избегайте написания испорченного кода (используйте такие инструменты, как asan / tsan / ubsan и Valgrind от Clang, и пишите тесты), или используйте язык, который не становится плохо сформированным при ошибках программирования (например, Java или Python) ,

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

Некоторые современные ОС направляют coredump в программу, которая его обрабатывает, например, загрузив его поставщику программного обеспечения для анализа. Вы могли бы сделать что-то подобное, хотя вам придется сделать это с вашей ОС. Впрочем, вероятно, достаточно просто отправить следы стека работающих потоков, а не всю память.

Вы также можете создавать трассировки стека работающей программы, либо используя библиотеку (libunwind?), Либо подключив отладчик, который прерывает программу, но, как правило, это не очень полезно — единственная интересная трассировка стека — это откуда произошла незаконная операция, потому что вы хотите знать, что это была за операция.

3

Другие решения

В зависимости от типа сбоя, с которым вы сталкиваетесь, вы также можете выполнять какие-либо операции регистрации в обработчике завершения ваших программ.

То, сколько информации об отладке доступно на этом этапе, во многом зависит от вашего компилятора и его настроек, и, конечно, нет гарантии, что это сработает в любой ситуации, например, если у вас недостаточно памяти.

0

Вы можете интегрировать Google Breakpad. Или вы можете хотя бы взглянуть на источники. AFAIK создает дампы, предоставляя различные обработчики сигналов.

0