C ++.Как узнать, где определен метод / переменная?или как спросить об этом компилятор? - PullRequest
2 голосов
/ 28 января 2011

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

Эта функция не определена в пакете, над которым я работаю, и поиск по самому пакету не дает мне никакого представления о месте, где эта функция определена в платформе.

Так что, очевидно, это определено в другом пакете где-то внутри фреймворка.

Я должен знать, что именно делает эта функция, поэтому я хотел бы «спросить» компилятор, где она определена. ... потому что пакет компилируется нормально, поэтому функция должна быть где-то определена! ; -)

Как это сделать?

Ответы [ 5 ]

5 голосов
/ 28 января 2011

Я бы установил точку останова при вызове «неизвестной» функции и запустил отладчик.Когда на этом этапе отладчик останавливается, я перехожу к функции и распечатываю обратную трассировку.Затем он должен войти в функцию и получить информацию об исходном файле, в котором находится функция.

С помощью gcc / gdb вы запускаете ваше приложение следующим образом:

gdb ./path_to_your_app/app_binary
(gdb) break SourceWhereYourFunctionIsCalled.cpp:123
(gdb) run
(gdb) step
(gdb) bt

И с VisualСтудия намного проще.Просто установите точку останова и войдите в F10, насколько я помню.Чем исходный файл будет автоматически открыт.

Я предполагаю, что у вас есть отладочная версия.

3 голосов
/ 29 января 2011

Вы можете «спросить» компилятор (и / или компоновщик), где он определен, создав второе определение этой функции.

void foo();

void foo() // function you are looking for
{
}

void foo() // second definition to tease the compiler.
{
}

Теперь компилятор будет жаловаться и давать вам подсказку

main.cpp: In function ‘void foo()’:
main.cpp:7: error: redefinition of ‘void foo()’
main.cpp:3: error: ‘void foo()’ previously defined here

Компоновщик теперь будет жаловаться и давать вам подсказку.

b.cpp:(.text+0x6): multiple definition of `foo()'

Теперь вы знаете, что настоящий foo находится в b.cpp.

Но что еслион определен в заголовочном файле?

main.cpp:

#include "secret.h"

void foo() // second definition to tease the compiler.
{
}

secret.h:

void foo() // function you are looking for
{
}

Теперь компилятор найдет его для вас:

main.cpp: In function ‘void foo()’:
main.cpp:3: error: redefinition of ‘void foo()’
secret.h:1: error: ‘void foo()’ previously defined here

Теперь вы знаете, что настоящее `foo 'определено в secret.h.

2 голосов
/ 28 января 2011

Если вы работаете на платформе Linux / Unix, вы также можете запустить следующую команду в двоичном файле:

нм -a -l бинарный | символ grep

пример:

$ nm -a -l test | grep main
                 U __libc_start_main@@GLIBC_2.2.5
00000000004004a8 T main /home/mwijekoo/tests/sizeof/test.c:6
1 голос
/ 28 января 2011

Большинство IDE могут искать код для определенных методов или определений.Компилятор обычно не делает этого.Попробуйте контекстное меню после выбора метода в коде.Функция может быть определена в связанной в библиотеке.В этом случае вы не можете получить доступ к коду, если не декомпилируете его.

Мне нужно знать, какой компилятор вы используете и какую IDE и т. Д.

1 голос
/ 28 января 2011

Что ж, моей первой попыткой будет попытаться выполнить глобальный поиск в вашей среде, например:

grep -R "MyMethod" /my/framework/root/path

Или используйте быструю и легкую замену grep .

Во-вторых, вы можете попробовать nm на исполняемом файле или библиотеке:

nm -al myexe

Опция -l должна давать вам файлы и номер строки, если вы скомпилировали с опциями отладки.

my2c

...