2013-08-01 2 views
0

Я разобрал код в руке. Я хочу знать соответствующий номер строки этих инструкций в исходном исходном файле.рычаг код сборки - понимание разобрать источник cpp

Кроме того, я хотел бы кое-что понять.

Функция, например, заявляет, что android::CameraHardware::createInstance отображается в сборе как _ZN7android18CameraHardware14createInstanceEib. Я даже не уверен, что это правильная функция, с которой я должен сравнивать ее или нет.

Почему имена так странно, и вещи добавляются спереди и сзади? Обычно я делаю то же самое для кода C. Названия функций выглядят прямо в разобранном коде.

Итак, чтобы подвести итог, у меня есть два вопроса.

  • Внутри GDB есть способ я мог бы получить номер строки определенной линии инструкции сборки?

    Скажите, например, на 0x40d9078c, я хочу знать, в какой строке это соответствует в своем исходном файле. Я пробовал инфо-линию. Не использовать. Любые другие предложения?

  • Когда мы понимаем разборки кода cpp, как понимать соглашения об именах? Также, что еще нужно, чтобы понимали как предпосылки?

Спасибо.

+0

Подсказка: посмотрите на 'extern 'C'', если вы пропустили свои прямые имена – nijansen

+0

1) Изучите сглаживание имен C++. 2) изучите язык символов отладки (например, DWARF). –

+2

Не знаю о 'gdb', но вы можете использовать' objdump' с параметрами '-SCld' для разборки, смешанной с исходными номерами строк и строк, с демарнированными именами. – Michael

ответ

3

Перевод с android::CameraHardware::createInstance на _ZN7android18CameraHardware14createInstanceEib называется «наименованием» и является нормальным для C++. Таким образом, вы можете иметь несколько функций с тем же именем, используя разные параметры, и заставить компоновщика сказать вам, что «я не смог найти foo(int x, double y)», когда вы только объявили его, но не определили его.

В Linux вы можете использовать c++filt, чтобы перевести искаженное имя в свою незастроенную форму (при условии, что оно скомпилировано с использованием соглашения об управлении в стиле Linux, которое делает андроид), но если вы должны были скомпилировать кусок кода Microsoft, работа).

Если вы скомпилируете символы отладки, gdb должен быть в состоянии показать вам источник для данной части кода. Добавить -g в строку g++ в компиляции.

+0

Благодарим вас за информацию Mats. можете ли вы ответить на мой комментарий под моим вопросом?Было бы полезно –

+0

Да, я уверен, вы можете найти какое-то место в 'android.mk' или одну из его зависимостей. К сожалению, я точно не знаю, где и как это сделать. Вероятно, проще всего найти имя функции ('grep -r CameraHardware :: createInstance *' в некотором месте, где хранится исходный код системы Android), а затем посмотреть, есть ли файл makefile где-то «рядом», который охватывает этот исходный файл. –

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