Как заставить valgrind сотрудничать с libsigsegv? - PullRequest
2 голосов
/ 19 февраля 2011

Как отмечалось в на вопрос об использовании libsigsegv для обнаружения множественных переполнений стека , я работаю с коллегой, чтобы попытаться обнаружить и исправить переполнение стека в интерпретаторе.Вкратце,

  1. Мы устанавливаем обработчик переполнения стека, используя libsigsegv.
  2. Обработчик уходит через sigsegv_leave_handler(), который затем возвращается в основной цикл интерпретатора через siglongjmp.

Эта установка успешно обнаруживает переполнение первого стека, но переполнение второго стека приводит к ошибке шины.Я хотел бы решить эту проблему с valgrind, но valgrind вступает во владение в first segfault.Мой вопрос, поэтому как я могу заставить valgrind позволить libsigsegv обработать первый segfault, затем взять на себя проверку памяти?

1 Ответ

1 голос
/ 20 февраля 2011

Valgrind - неправильный инструмент для отладки этой проблемы - вы, вероятно, страдаете не от повреждения кучи (а это то, в чем Valgrind хорош), а от чего-то другого.

Я бы использовал GDB для отладки этой проблемы,Когда вы нажмете первую SIGSEGV, GDB остановится.Вы можете попросить его доставить сигнал приложению с помощью (gdb) signal SIGSEGV, после чего ваш переводчик выполнит siglongjmp.В конце концов вы получите SIGBUS и сможете отлаживать, как вы туда попали.

Поскольку вы, скорее всего, работаете в Linux, обратите внимание, что SIGBUS встречается довольно редко и обычно является результатом попытки получить доступ к памяти, которая либоне нанесены на карту вообще, или с неправильной защитой.Изучение /proc/<pid>/maps в точке доставки SIGBUS скорее всего поможет.

...