Признает ли получение случайных сигналов SIGTRAP (в MinGW-gdb) повреждение памяти? - PullRequest
6 голосов
/ 22 февраля 2010

Я написал свой собственный менеджер подсчитанных ссылок c ++ (для удовольствия), и я уверен, что он не идеален;). И теперь, когда я пытаюсь использовать его, я получаю случайные сигналы SIGTRAP. Если я закомментирую каждую строку, связанную с этим диспетчером памяти, все будет нормально. Получение SIGTRAP-s вместо SIGSEGV довольно странно. Я знаю, что SIGTRAP-ы выбрасываются, когда программа достигает точки останова, но точка останова не установлена. Я прочитал в другой ветке, что отладочные сборки exe и dll должны быть обновлены. Они в курсе, и это не причина.

Кто-нибудь знает, почему это происходит?

Ответы [ 2 ]

4 голосов
/ 25 февраля 2010

После поиска в Google я понял, что эти сигтрапы совпадают с теми предупреждениями, которые вы получаете в MSVC ++: «Windows запустила точку останова в xxxx.exe. Это может быть связано с повреждением кучи и указывает на ошибку, бла-бла». ...

Так что, похоже, да, неожиданные sigtraps могут указывать на повреждение памяти (довольно странно ...)

И я тоже нашел свою ошибку. ММ находится в статической библиотеке, которая связана с DLL. И эта статическая библиотека и DLL связаны с моим exe. Таким образом, было два менеджера памяти, один в моем exe и один в моей dll. Если вызвать метод инициализации ММ. Он инициализировал MM в моем exe, но не в dll, поэтому dll прошла без init. Я решил это, не связывая свой exe-файл с этой статической библиотекой.

2 голосов
/ 24 февраля 2010

Я бы добавил, что вы могли бы вызывать несоответствующие реализации new / delete или malloc / free - так что ваш менеджер памяти выделил что-то, но когда память освобождается, вы получаете реализацию по умолчанию delete / free.

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

...