Отладка повреждения памяти на MinGW

У меня возникли проблемы с повреждением памяти в довольно большом проекте по управлению некоторым научным оборудованием (около 6000 строк), и я не уверен, какой лучший способ/инструмент для решения проблемы. В проекте используется Qt 4.8, и он создан с помощью QtCreator и MinGW. Программа более-менее работает, но у меня проблемы со стабильностью. Иногда я получаю случайные сбои, но в некоторых случаях, когда я немного изменяю исходный код, программа падает точно в том же месте (там, которое работало ранее). Позиция, которую он выбрал на этот раз, выглядит так:

 char stages2[1024];
 sprintf(stages2, "M-511.DD.LOAD\nNOSTAGE");

Вторая строка дает ошибку сегментации (SIGSEGV), когда я запускаю ее в gdb, что говорит мне о какой-то проблеме с памятью программы, потому что я уверен, что эти две строки верны. Кроме того, «место сбоя» меняется в зависимости от точного исходного кода; Я даже видел сбои в Windows DLL, которые использует Qt.

Я рассмотрел несколько вариантов, чтобы найти причину проблемы, но столкнулся с некоторыми трудностями:

  • Я скачал DUMA, но никак не могу его скомпилировать на MinGW - мне пришлось изменить команду включения, чтобы создать библиотеку, но теперь одна из тестовых программ дает сбой. (Любые подсказки или ссылки на двоичные файлы, кто-нибудь?)
  • Я также пробовал Application Verifier, но когда я запускаю его, он всегда останавливается в одной и той же позиции, где сторонний DLL, который я использую, пропускает дескриптор. Я достаточно уверен, что это не причина моих проблем, но я не могу продолжать процесс отладки, потому что gdb всегда возвращается в одно и то же положение (он застревает там только тогда, когда я использую средство проверки приложений).
  • Наконец, я запустил свою программу с помощью Dr. Memory, но она просто вылетает, не дойдя до главного окна, не давая мне никаких полезных результатов (единственное, что я вижу, это то, что Qt явно тратит немного памяти).

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


person xqrp    schedule 10.03.2014    source источник
comment
Это многопоточная программа?   -  person PaulMcKenzie    schedule 10.03.2014
comment
@PaulMcKenzie Да, много потоков (десяток или около того?), Некоторые принадлежат самой программе, большинство, я думаю, управляются Qt.   -  person xqrp    schedule 11.03.2014


Ответы (1)


Скомпилируйте с оптимизацией и -Wall (и, возможно, другими флагами предупреждений), проверьте все предупреждения, чтобы убедиться, что ничего подозрительного не происходит.

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

person vonbrand    schedule 10.03.2014
comment
Я думаю, что -Wall включен по умолчанию, когда вы создаете конфигурацию отладки, но я все равно проверю. Я застрял в Windows из-за некоторых сторонних вещей, поэтому, думаю, я не могу использовать valgrind - не могли бы вы предложить какие-либо инструменты для Windows? - person xqrp; 11.03.2014
comment
Вы можете использовать cppcheck для выявления ошибок и подозрительных вещей. - person ManuelAtWork; 31.05.2016
comment
MinGW работает в Windows, а Valgrind работает в GNU/Linux. Так что совет не очень полезный. Однако программа Qt должна быть переносима в GNU/Linux с небольшой доработкой. Затем вы можете попробовать использовать Valgrind. - person user1741137; 21.06.2020