2010-01-22 1 views
3

Возможно ли запустить GDB с программой, собранной с помощью as и связанной с ld? С gcc добавление флага -g позволяет отлаживать, но я получаю ошибку No symbol table is loaded. Use the "file" command, когда пытаюсь добавить точки останова в загруженную программу.gdb без gcc

Спасибо!

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

Разрешение Запуск as -g делает трюк.

Благодарим всех, кто ответил!

ответ

5

Это возможно. Однако вам нужны символы, чтобы добавить символические точки останова, а символы предоставляются путем отладки информации; убедитесь, что ваш ассемблер и компоновщик предоставляют их. EDIT С GNU as, используйте as -g. Или просто используйте gcc -g: если вы дадите файл .s, он будет при необходимости использовать ассемблер и компоновщик.

GDB распознает отладочную информацию в нескольких форматах: stabs, COFF, PE, DWARF, SOM. (Некоторые из них являются исполняемыми форматами с разделами отладки, другие - отформатированными форматами информации, которые могут быть встроены в исполняемые файлы, например, ELF.) gcc -g обычно выбирает все, что по умолчанию для платформы, gcc -ggdb обычно выбирает наиболее выразительные (в зависимости от ваших версий, возможно DWARF-3).

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

Вы все еще можете отлаживать без символической информации. Например, вы можете указать break *0x89abcdef, чтобы вставить точку останова по этому адресу, если там есть какой-либо код.

2

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

+0

Можете ли вы сказать мне, что это за другой способ? – Tyler

+0

@ Тайлер: Я бы знал, если бы знал.:) – Teddy

1

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

gdb> b 0x12345678

Конечно, это только полезно, если вы знаете, что вы хотите, чтобы остановить на 0x12345678

Что file говорят о вашем исполняемом файле?

+0

'Чтение символов из ~/Программирование/ASM/most_number ... (не найдены отладочные символы) ... done.' 10 most_number был собран с' as' и связан с 'ld' – Tyler

+0

Ярмарка, чтобы предположить, что вы на самом деле хотите использовать символические контрольные точки? Проверьте аргументы на ld, вероятно, способ добавить в таблицу символов. Проверьте человека как и человека? –

3

вы можете попробовать запустить as с параметрами -gdwarf-2 или -g и убедиться, что ld не вызывается с помощью -strip-debug и что ваш makefile/install не лишает исполняемый файл.

Смежные вопросы