LINUX.ORG.RU

gdb, ошибка «Cannot access memory at address» когда выполняю пошаговое выполнение программы

 , ,


0

2

Добрый день!

Столкнулся со следующей проблемой. Имею программу, собранную на другом компе + исходники. Есть необходимость заняться её отладкой. Указываю gdb путь до исходников, ставлю breakpoint'ы, вроде всё ок.

Начинаю пошаговое выполнение программы (n), и в определенный момент (всегда в одном и том же месте (где находится просто if)) получаю следующую ошибку: «Backtrace stopped: Cannot access memory at address 0x2e323935»

Вот что пишет bt после того как я получаю данную ошибку:

#0 0x08048310 in ?? ()
#1 0x2e383631 in ?? ()
#2 0x2e303031 in ?? ()
#3 0x30310033 in ?? ()
#4 0x00000011 in ?? ()
#5 0x00000003 in ?? ()
#6 0x09b8bc48 in ?? ()
Backtrace stopped: Cannot access memory at address 0x2e323935

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

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

Буду признателен за помощь, спасибо!

собранную на другом компе + исходники

Ты её именно запускаешь, или корку смотришь?

С коркой есть нюансы, наступал на такие грабли.

Если приложение многопоточное, то попробуй то же самое, но выставив опцию:

set scheduler-locking step

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

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

pon4ik ★★★★★ ()

С отладочными символами собрал?

UVV ★★★★★ ()
Ответ на: комментарий от pon4ik

Спасибо всем за советы!

Всё оказалось куда проще - нужно было добавить несколько флагов при сборке библиотек, с которой собирается приложение.

penetrator3000 ()
Ответ на: комментарий от penetrator3000

Флаги секретные? Обычно, если решение находишь, то делишься им.

UVV ★★★★★ ()
Ответ на: комментарий от UVV

Флаги секретные? Обычно, если решение находишь, то делишься им.

Наверное -O0 -g или -ggdb

andreyu ★★★★★ ()
Ответ на: комментарий от andreyu

Не факт. Мне в моей практике как-то понадобился -femit-class-debug-always. Поэтому и спрашиваю.

UVV ★★★★★ ()
Последнее исправление: UVV (всего исправлений: 1)
Ответ на: комментарий от i-rinat

А разве его бэктрейс не говорит о том, что у него покоцан стек или указатель на него?

andreyu ★★★★★ ()
Ответ на: комментарий от andreyu

gdb не смог стек развернуть. Возможно, стек повреждён или неправильно развёрнут. С -fno-omit-frame-pointer может выйти лучше.

i-rinat ★★★★★ ()
Последнее исправление: i-rinat (всего исправлений: 1)
Ответ на: комментарий от i-rinat

gdb не смог стек развернуть.

Угу. Но почему он этого не смог сделать? Я знаю, что так бывает если стек испорчен или испорчен указатель на стек. Другие причины мне не известны.

Возможно, с -fno-omit-frame-pointer у него получилось бы лучше?

Не знаю, потому и задал вопрос.

andreyu ★★★★★ ()
Ответ на: комментарий от andreyu

В доке на -fomit-frame-pointer сказано:
«Don't keep the frame pointer in a register for functions that don't need one. This avoids the instructions to save, set up and restore frame pointers; it also makes an extra register available in many functions. It also makes debugging impossible on some machines.»

andreyu ★★★★★ ()
Ответ на: комментарий от andreyu

А еще gcc должен быть собран с --enable-frame-pointer, иначе флаг -fno-omit-frame-pointer ничего не даст.

andreyu ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.