首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在C++项目中找到程序入口点

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

Stack Overflow用户
提问于 2014-03-31 12:49:32
回答 3查看 2.3K关注 0票数 2

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

1-所有.cpp文件

2-所有.h文件

3-3个共享图书馆。

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

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

我很乐意提供你为解决我的问题可能需要的任何信息或材料。

编辑:可用的CMakeLists.txt文件这里

编辑2:可用的build.sh文件这里

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-02 07:32:03

若要查找整数,请使用以下内容查看每个共享对象:

代码语言:javascript
复制
nm $library | egrep "T main$"

使用main()的库将输出类似于

代码语言:javascript
复制
090d8ab0 T main

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

代码语言:javascript
复制
valgrind --tool=callgrind ./my_executable -arg -arg ....

(您可以使用Ctrl+C__尽早中止执行)

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

您将需要valgrind

代码语言:javascript
复制
sudo apt-get install valgrind

kcache差制

代码语言:javascript
复制
sudo apt-get install kcachegrind
票数 4
EN

Stack Overflow用户

发布于 2014-04-01 12:17:45

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

在此之前,请稍加处理代码。尝试在任何看起来重要的函数中打印内部变量的printfcout语句,看看程序状态是什么以及它们被调用的频率。如果main隐藏在库中,那么对于任何拥有真正main的库所提供的API而言,可能会有另一个类似于main的函数。

您的库的API文档是什么?(这是学校的项目吗?)有一个隐藏的main,却什么也不说,听起来很奇怪。

票数 0
EN

Stack Overflow用户

发布于 2014-04-01 12:51:49

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

而且,构建系统可能会删除生成的文件,原因是最初的开发人员考虑了一些模糊的策略,但没有告诉您。因此,搜索您的构建系统文件,看看实际发生了什么。

编辑

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

检查${DIR_EXT}/covis/src/ci.cppDIR_EXT在哪里是SET( DIR_EXT "../ext/" CACHE PATH "Folder holding external libraries" )

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

Edit2

在看到build.sh之后(按顺序执行步骤):

1.变化

代码语言:javascript
复制
`cmake -D COMPILE_BINARY=ON ..` 

代码语言:javascript
复制
`cmake -D COMPILE_BINARY=ON -DCMAKE_BUILD_TYPE=Debug ..`

并将相同的-DCMAKE_BUILD_TYPE=Debug添加到另一个cmake命令中。

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

2.现在,在您可以访问的c++源文件中,您肯定会被调用(函数越早就会越好),添加如下:

代码语言:javascript
复制
asm("int $0x03");

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

(如果您不想使用这个,请参阅下面)。

3.构建您的应用程序。

4.通过终端中的调试器运行它:

代码语言:javascript
复制
gdb ./myapplication <ENTER>

(这将给您一个gdb提示)

(如果没有从上面添加asm断点,请输入gdb提示:break filename.cpp:linenumberbreak methodname以添加gdb断点)。

代码语言:javascript
复制
run <ENTER>

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

代码语言:javascript
复制
bt <ENTER>

这将打印出应用程序的回溯跟踪。在某个地方,您应该看到一个主函数,以及文件名和linenumber。

然而,这个setnames.sh看起来很有趣,看看它是否做了什么有趣的事情:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22761982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档