Как я могу отладить отказы St9bad_alloc в gdb в C?

Использование ini файла, в том же каталоге как приложение, позволяет создать резервную копию его с приложением. Таким образом, после перезагрузки ОС Вы просто восстанавливаете каталог приложения, и у Вас есть своя конфигурация путем, Вы хотите его.

9
задан Nathan Fellman 2 November 2009 в 09:54
поделиться

2 ответа

Исключение на самом деле вызывает не malloc / free, а «новый», который определенно присутствует в C ++ части вашего приложения. Похоже, вы предоставляете параметр, который слишком велик для «нового» для выделения.

'std :: bad_alloc' вызывается, например, следующим кодом:

 int * p = new int[50000000];

Что говорит обратная трассировка, когда вы загружаете аварийный дамп в gdb? Если вы не можете сгенерировать дамп, вы можете попросить GDB остановить при возникновении или обнаружении исключения . К сожалению, некоторые версии GDB поддерживают только следующий синтаксис:

catch throw

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

catch throw std::bad_alloc

.

И не забывайте, что:

(gdb) help catch

- хороший источник другой полезной информации.

14
ответ дан 4 December 2019 в 14:29
поделиться

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

Если у вас есть возможность (например, вы используете x86 Linux), запустите вашу программу в Valgrind , он часто может показать вам, где именно происходит коррупция.

0
ответ дан 4 December 2019 в 14:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: