Как я могу отлаживать ошибки St9bad_alloc в GDB в C? - PullRequest
8 голосов
/ 02 ноября 2009

У меня сбой программы:

terminate called after throwing an instance of 'std::bad_alloc'
  what():  St9bad_alloc

Я думаю, это как-то связано с malloc / free, но я не знаю, какой именно.

Какую точку останова я могу установить в gdb, чтобы она прервалась при ошибке, чтобы я мог просмотреть трассировку стека?

Программа представляет собой комбинацию C и C ++, скомпилированную с gcc 3.4.2.

Ответы [ 3 ]

13 голосов
/ 02 ноября 2009

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

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

 int * p = new int[50000000];

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

catch throw

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

catch throw std::bad_alloc

в более новых версиях.

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

(gdb) help catch

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

0 голосов
/ 20 января 2011

У меня было это при попытке прочитать в файле, который не существует ... Я бы попытался создать внутренний буфер для содержимого файла, но поскольку файл не существовал, мое создание буфера облажался.

int lenth_bytes;
length_bytes = in_file.tellg();
new char [length_bytes]; // length_bytes hadn't been initialised!!!!

Помните, дети, всегда инициализируйте свои переменные: D и проверяйте на ноль случаев.

0 голосов
/ 02 ноября 2009

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

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

...