无法在C ++项目中找到程序入口点

时间:2014-03-31 12:49:33

标签: c++ ubuntu-12.04 main pipeline entry-point

我在Ubuntu 12.04中有一个C ++项目。要运行项目,make文件需要以下文件:

1 - 所有.cpp文件

2 - 所有.h文件

3-Three共享库。

该项目功能齐全,可根据规格执行。所有必需的.cpp文件和.h文件都可用。问题是任何源文件中都没有main()函数,程序入口点位于三个共享库之一。我的工作是找出程序执行管道,没有任何主文件,我无法做到这一点。我无法在任何IDE中运行该项目(即:eclipse),因为没有可用的主要功能。

问题:您能告诉我如何找到程序入口点吗?

P.S:我很乐意提供您解决问题所需的任何信息或材料。

修改:CMakeLists.txt文件可用here

编辑2 :build.sh文件可用here

3 个答案:

答案 0 :(得分:4)

使用以下方法查找每个共享对象的内容:

nm $library | egrep "T main$"

main()的图书馆会输出类似

的内容
090d8ab0 T main

可视化执行树的非常有用的方法是运行:

valgrind --tool=callgrind ./my_executable -arg -arg ....

(您可以通过 Ctrl + C 提前中止执行)​​

这将输出callgrind.<pid>文件。要使其可视化,请运行kcachegrind callgrind.<pid>


您需要 valgrind

sudo apt-get install valgrind

kcachegrind

sudo apt-get install kcachegrind

答案 1 :(得分:0)

使用调试选项-g构建它,并使用调试器(如gdb(或cgdb或ddd))进入程序。您需要任何适当的调试库库。

除此之外,请稍微使用代码。尝试将printfcout语句放在任何看起来很重要的函数中打印内部变量,并查看程序状态是什么以及调用它们的频率。如果main隐藏在库中,则可能存在另一个函数,其行为类似于main,用于由具有真实main的任何库提供的API。

您的图书馆的API文档是什么? (这是一个学校项目吗?)。有一个隐藏的main并且没有说出任何关于它的事情听起来很奇怪。

答案 2 :(得分:0)

如果您使用构建系统(CMake,SCons,...),构建系统很可能也会生成一些文件,其中一个文件可能包含main()方法。当我们生成main函数时,我们使用这种方法来实例化在CMake-gui中专门选择的库的类。

同样,构建系统可能会删除生成的文件,因为原始开发人员想到的一些模糊的策略却没有告诉你。因此,搜索构建系统文件,查看实际发生的情况。

修改

所以,在看到你CMakeLists.txt之后:

检查${DIR_EXT}/covis/src/ci.cpp DIR_EXTSET( DIR_EXT "../ext/" CACHE PATH "Folder holding external libraries" )

build.sh

看看那里有什么,让我们知道:)

<强> EDIT2

看到`cmake -D COMPILE_BINARY=ON ..` 后(按顺序执行步骤):

<强> 1 改变

`cmake -D COMPILE_BINARY=ON -DCMAKE_BUILD_TYPE=Debug ..`

-DCMAKE_BUILD_TYPE=Debug

并将相同的cmake添加到另一个asm("int $0x03"); 命令中。

这将在调试模式下构建您的库和可执行文件。

<强> 2 现在,在您可以访问的一个c ++源文件中,您确定将被调用(函数越早越好),添加:

gdb ./myapplication <ENTER>

这将在您的应用程序中创建一个断点。

(如果您不想使用此功能,请参阅下文)。

第3 构建您的应用程序。

<强> 4 通过终端中的调试器运行它:

asm

(这会给你一个gdb提示)

(如果你没有从上面添加break filename.cpp:linenumber断点,请输入gdb提示符:break methodnamerun <ENTER> 以添加gdb断点。)

bt <ENTER>

现在,您的应用程序应在执行时停止在您的函数中。 您仍处于gdb提示符中,因此请键入:

setnames.sh

这将打印出您的应用程序的回溯。在某处你应该看到一个主要功能,以及文件名和亚麻布。

但是,{{1}}看起来很有趣,看看它是否有什么不好用的事情:)