C ++。如何知道定义方法/变量的位置?或者如何询问编译器呢?

时间:2011-01-28 09:32:41

标签: c++ compiler-construction methods compilation

在我们非常大的框架中,追踪一个包中的错误,我最终调用了一个函数。

这个函数没有在我正在处理的包中定义,对包本身的搜索并没有给我任何关于在框架中定义该函数的地方的线索。

显然,它是在框架内某处的另一个包中定义的。

我必须知道这个函数究竟是做什么的,所以我想“询问”编译器定义的位置。 ...因为包编译得很好,所以必须在某处定义函数! ; - )

怎么做?

5 个答案:

答案 0 :(得分:5)

我会在调用“unknown”函数时设置一个断点并运行一个调试器。当调试器在此时停止时,我将进入该函数并打印回溯。它应该进入函数并提供函数所在源文件的信息。

使用gcc / gdb,您可以像这样运行您的应用程序:

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

使用Visual Studio,它更容易。只要设置一个断点,就我记得的F10步入。比源文件会自动打开。

我假设你有一个调试版本。

答案 1 :(得分:3)

您可以通过创建该函数的第二个定义来“询问”编译器(和/或链接器)的定义。

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 :(得分:2)

如果您使用的是linux / unix平台,还可以在二进制文件上运行以下命令:

nm -a -l binary | 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

答案 3 :(得分:1)

好吧,我的第一次尝试是在您的框架中尝试全局搜索,如下所示:

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

或使用快速简便的grep replacement

其次,你可以在可执行文件或库上尝试nm:

nm -al myexe

-l选项应该为您提供文件和行号,如果您已使用调试选项进行编译。

MY2C

答案 4 :(得分:1)

大多数IDE都可以在代码中搜索特定的方法或定义。编译器通常不会这样做。在代码中选择方法后尝试上下文菜单。 该函数可以在链接的库中定义。在这种情况下,您无法访问代码,除非您对其进行反编译。

我需要知道您使用的是哪个编译器以及哪个IDE等。