Как сделать отладку на уровне исходного кода библиотеки - PullRequest
2 голосов
/ 01 апреля 2009

У меня есть следующие настройки. Хотя моя рабочая установка имеет дело с компилятором ARM Real View Developer Suite (RVDS) 3.2 на хосте Windows, ситуация может быть общей для любого другого компилятора C на любом хосте.

Я создаю библиотеку ARM (статическая библиотека - файл .a) кода C, используя набор инструментов компилятора RVDS 3.2 на хосте Windows. Затем я связываю эту библиотеку с приложением, использующим набор инструментов компилятора ARM-Linux на хосте Linux, чтобы получить исполняемый файл ARM. Теперь, когда я пытаюсь отладить этот сгенерированный исполняемый файл ARM в Linux с помощью gdb, пытаясь установить точку останова в какой-либо функции, которая присутствует в связанной библиотеке, gdb не может поставить точку останова, ссылаясь на источник, который не найден. Поэтому я вручную скопировал все исходные файлы (*. C), использованные для создания библиотеки в папке Linux, где присутствует исполняемый файл. Тем не менее GDB не может поставить точку останова. Так что теперь я начал думать:

  1. Как мне выполнить отладку на уровне исходного кода этой библиотеки, которую я создаю в Windows, используя другую цепочку компиляторов, запустив исполняемый файл, сгенерированный путем связывания этой библиотеки с приложением, в gdb. Является ли это возможным? Как мне это сделать? Есть ли какая-либо опция компилятора в наборе инструментов компилятора RVDS для включения отладки на уровне исходного кода библиотеки?

  2. Нужно ли копировать исходные файлы в linux точно в той же структуре папок, что и в Windows для этих исходных файлов?

Ответы [ 4 ]

1 голос
/ 04 ноября 2015

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

1 голос
/ 05 апреля 2009

Во-первых, GDB не нужен какой-либо источник для установки точек останова на функции; поэтому ваше описание того, что на самом деле происходит, вероятно, неточно. Я бы начал с проверки того, что функция, которую вы хотите разбить, на самом деле есть в двоичном файле:

  nm /path/to/app | grep function_desired

Во-вторых, для отладки на уровне исходного кода GDB требуется информация отладки в формате, понятном GDB. В Linux это обычно означает DWARF или STABS. Вполне возможно, что ваш компилятор RVDS не выдает такую ​​отладочную информацию; в этом случае отладка на уровне источника будет невозможна.

1 голос
/ 05 апреля 2009

Собирали ли вы библиотеку с включенной отладкой (опция -g)? Без этого были бы трудности с определением линий и т. Д.

1 голос
/ 01 апреля 2009

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

...