Вопрос

Я запускаю свою программу на C++ в GDB.У меня нет большого опыта работы с GDB, но я получаю такие сообщения:

warning: HEAP[test.exe]:
warning: Heap block at 064EA560 modified at 064EA569 past requested size of 1

Как я могу отследить, где это происходит?Просмотр воспоминаний не дал мне никаких подсказок.

Спасибо!

Это было полезно?

Решение

Итак, вы разбиваете свою кучу.Вот хороший Учебное пособие по GDB держать в уме.

Моя обычная практика — разрывать заведомо исправную часть кода.Как только он доберется туда, проходите, пока не произойдет ошибка.Обычно таким образом можно определить проблему.

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

Другие советы

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

Я дал примерное представление о том, как использовать это в отвечать на другой вопрос.

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

Вы можете попробовать одну вещь: это то же самое, что и стандартная libc, с настроенной переменной окружения MALLOC_CHECK_ (man libc).

Если вы не выходите из GDB (если ваше приложение завершится, просто используйте «r», чтобы перезапустить его), вы можете установить точку останова памяти по этому адресу «hbreak 0x64EA569», также используйте «help hbreak» для настройки условий или других Параметры включения/выключения точки останова, чтобы предотвратить чрезмерный вход в эту точку останова....

Вы можете просто настроить файл журнала, установить журнал...Настройте трассировку стека при каждом перерыве, "display/BT -4", затем нажмите R, и просто зажмите клавишу Enter, чтобы она прокрутилась "Или используйте C ##, чтобы продолжить X раз...и т. д.», в конечном итоге вы увидите то же самое утверждение, тогда у вас теперь будет (благодаря display/bt) ​​трассировка стека, которую вы можете сопоставить с тем, какой код изменялся по этому адресу...

У меня была похожая проблема, когда я пытался перераспределить массив указателей на свои структуры, но вместо этого я перераспределял их как массив целых чисел (потому что я получил код из учебника и забыл его изменить).Компилятор меня не поправлял, потому что невозможно проверить, что находится в аргументе размера.Моя переменная была:

itemsetList_t ** iteration_isets;

Итак, в realloc вместо:

iteration_isets = realloc(iteration_isets, sizeof(itemsetList_t *) * max_elem);

Я имел:

iteration_isets = realloc(iteration_isets, sizeof(int) * max_elem);

И это вызвало мою проблему с кучей.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top