2013-08-29 5 views
0

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

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

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

+1

Вы пробовали структурировать свой цикл разработки вокруг модульного тестирования? :-) –

+0

Удостоверьтесь, что у вас есть большой внешний блок try в главном. Что вы подразумеваете под «управлением памятью»? http://accu.org/index.php/journals/1586 – doctorlove

ответ

3

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

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

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

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

0

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

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

0

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

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