Вопрос по gdb, memory, c++, debugging, segmentation-fault – Определить переменную, вызывающую ошибку памяти

1

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

В основном то, что я вижу, это ошибка сегмента. Симптомы следующие:

Это происходит только тогда, когда программа находится в режиме выпуска, а не в отладке.

Это выглядит как segfault, и GDB говорит мне, что он находится в //_list_release_free()free() в конце функции.

Program received signal SIGSEGV, Segmentation fault.

0xb0328af8 in _list_release () from /usr/qnx650/target/qnx6/x86/lib/libc.so.3

(gdb) bt

0 0xb0328af8 in _list_release () from /usr/qnx650/target/qnx6/x86/lib/libc.so.3

1 0xb032a464 in __free () from /usr/qnx650/target/qnx6/x86/lib/libc.so.3

2 0xb0329f7d in free () from /usr/qnx650/target/qnx6/x86/lib/libc.so.3

Я не использую динамическую память (за исключением того, что может появиться в Eigen (или других библиотеках)

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

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

Что я хотел бы сделать, это следующее:

Это было бы очень полезно: как я могу принудительно вызвать эту ошибку в режиме отладки, тогда GDB будет гораздо более полезным.Каков наилучший способ отследить, какой маленький педераст вызывает проблему.НОТА: Я не могу использовать valgrind, он не работает в операционной системе, которую я использую (QNX)

Любая помощь будет отличной.

Можете ли вы запустить приложение для тестирования на более мощной платформе? David Schwartz
I can print all local variables just before the end of the function, so its not a double free. Двойное освобождение - неопределенное поведение, так чтоне обязательно правда. chris
@ Крис Хорошо, как бы я это проверил? Fantastic Mr Fox
Что ж, лучший способ избежать этого - использовать RAII и тому подобное, чтобы сразу же предотвратить многие из распространенных причин сегрегаций. Там'всегда лязгс уловом-неопределенным поведением, которое может помочь. chris

Ваш Ответ

1   ответ
4

и GDB сообщает мне, что он находится в _list_release / _free () / free ()

В общем-то,любой врезаться вfree() является признаком повреждения кучи (двойное освобождение, запись в свободный 'd памяти, освобождение нераспределенной (например, стека или глобальной) памяти или переполнение буфера кучи).

Я не использую динамическую память

Да тыявляются, Тот факт, что вы делаете это косвенно через другие библиотеки, не имеет значения.

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

Как уже говорили многие комментаторы, ваш вывод неСледуйте: вы можете получить доступ бесплатноПамять просто прекрасна, и она может даже содержать разумные значения.

Как я могу вызвать эту ошибку в режиме отладки, тогда GDB будет более полезным.

Вы можете построить с '-O2 -g ' (а "релиз" режим, но с включенной отладочной информацией).ГБД скорее всегоне быть более полезным - GDB несколько бесполезен в отладке повреждения кучи.

Каков наилучший способ отследить, какой маленький педераст?

У вас есть несколько вариантов:

Перенесите свой код на платформу, где вы можете использоватьValgrind или жеAddressSanitizerИспользуйте одну из многих отладочных реализаций malloc (dmalloc, mpatrol и т. Д.). QNX имеетодин.Внимательно прочитайте код, убедившись, что вы ненаписать больше данных в возможно-malloc 'буферы, чем вы должны.
Могу ли я добавить, что я перенес его в Ubuntu, но ошибка не возникает в Ubuntu. Это также неЭто происходит, когда код построен на компьютере партнера (даже если это тот же компилятор, и версия cmake, и ОС). Любые советы для этого? Fantastic Mr Fox
Так что сборка с отладочными флагами интересна. Знаете ли вы, если это можно установить с помощью CMAKE? Fantastic Mr Fox
@ Бен яконечно это можно сделать сCMAKEно я нене знаю деталей. Employed Russian

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