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

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

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

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

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

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

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

0

Решение

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

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

0

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

Других решений пока нет …