我在Ubuntu12.04中有一个C++项目。要运行项目,make文件需要以下文件:
1-所有.cpp文件
2-所有.h文件
3-3个共享图书馆。
该项目功能齐全,并按照规范执行。所有必需的.cpp文件和.h文件都可用。问题是在任何源文件中都没有main()函数,程序入口点驻留在三个共享库中的一个。我的工作是找出程序执行管道,而没有任何主文件,我无法做到这一点。我无法在任何IDE (即: eclipse)中运行该项目,因为没有可用的主函数。
问题:您能告诉我如何找到程序入口点吗?
我很乐意提供你为解决我的问题可能需要的任何信息或材料。
编辑:可用的CMakeLists.txt文件这里。
编辑2:可用的build.sh文件这里。
发布于 2014-04-02 07:32:03
若要查找整数,请使用以下内容查看每个共享对象:
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和kcache差制
sudo apt-get install kcachegrind发布于 2014-04-01 12:17:45
使用调试选项-g构建它,并使用gdb (或cgdb或ddd)这样的调试器进入程序。不过,您将需要任何适当的调试库。
在此之前,请稍加处理代码。尝试在任何看起来重要的函数中打印内部变量的printf或cout语句,看看程序状态是什么以及它们被调用的频率。如果main隐藏在库中,那么对于任何拥有真正main的库所提供的API而言,可能会有另一个类似于main的函数。
您的库的API文档是什么?(这是学校的项目吗?)有一个隐藏的main,却什么也不说,听起来很奇怪。
发布于 2014-04-01 12:51:49
如果您使用构建系统(CMake,SCons,.)构建系统也很可能生成一些文件,其中一个文件可能包含main()方法。在生成主函数时,我们使用这种方法来实例化CMake中专门选择的库的类。
而且,构建系统可能会删除生成的文件,原因是最初的开发人员考虑了一些模糊的策略,但没有告诉您。因此,搜索您的构建系统文件,看看实际发生了什么。
编辑
所以,在看到你之后,CMakeLists.txt:
检查${DIR_EXT}/covis/src/ci.cpp,DIR_EXT在哪里是SET( DIR_EXT "../ext/" CACHE PATH "Folder holding external libraries" )
看看里面有什么,让我们知道:)
Edit2
在看到build.sh之后(按顺序执行步骤):
1.变化
`cmake -D COMPILE_BINARY=ON ..` 至
`cmake -D COMPILE_BINARY=ON -DCMAKE_BUILD_TYPE=Debug ..`并将相同的-DCMAKE_BUILD_TYPE=Debug添加到另一个cmake命令中。
这将在调试模式下构建库和可执行文件。
2.现在,在您可以访问的c++源文件中,您肯定会被调用(函数越早就会越好),添加如下:
asm("int $0x03");这将在应用程序中创建一个断点。
(如果您不想使用这个,请参阅下面)。
3.构建您的应用程序。
4.通过终端中的调试器运行它:
gdb ./myapplication <ENTER>(这将给您一个gdb提示)
(如果没有从上面添加asm断点,请输入gdb提示:break filename.cpp:linenumber或break methodname以添加gdb断点)。
run <ENTER>现在,当您的应用程序执行时,它应该停止在您的函数中。您仍然处于gdb提示符中,因此键入:
bt <ENTER>这将打印出应用程序的回溯跟踪。在某个地方,您应该看到一个主函数,以及文件名和linenumber。
然而,这个setnames.sh看起来很有趣,看看它是否做了什么有趣的事情:)
https://stackoverflow.com/questions/22761982
复制相似问题