我在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。
答案 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))进入程序。您需要任何适当的调试库库。
除此之外,请稍微使用代码。尝试将printf
或cout
语句放在任何看起来很重要的函数中打印内部变量,并查看程序状态是什么以及调用它们的频率。如果main
隐藏在库中,则可能存在另一个函数,其行为类似于main
,用于由具有真实main
的任何库提供的API。
您的图书馆的API文档是什么? (这是一个学校项目吗?)。有一个隐藏的main
并且没有说出任何关于它的事情听起来很奇怪。
答案 2 :(得分:0)
如果您使用构建系统(CMake,SCons,...),构建系统很可能也会生成一些文件,其中一个文件可能包含main()
方法。当我们生成main函数时,我们使用这种方法来实例化在CMake-gui中专门选择的库的类。
同样,构建系统可能会删除生成的文件,因为原始开发人员想到的一些模糊的策略却没有告诉你。因此,搜索构建系统文件,查看实际发生的情况。
修改强>
所以,在看到你CMakeLists.txt之后:
检查${DIR_EXT}/covis/src/ci.cpp
DIR_EXT
是SET( 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 methodname
或run <ENTER>
以添加gdb断点。)
bt <ENTER>
现在,您的应用程序应在执行时停止在您的函数中。 您仍处于gdb提示符中,因此请键入:
setnames.sh
这将打印出您的应用程序的回溯。在某处你应该看到一个主要功能,以及文件名和亚麻布。
但是,{{1}}看起来很有趣,看看它是否有什么不好用的事情:)