如何找到我的.exe入口点函数?

时间:2014-07-09 06:40:53

标签: c++ windows debugging visual-studio-2012 64-bit

我觉得这个问题非常愚蠢,但在评论“它是main(),duh”之前,请耐心等待并阅读症状。

我正在使用Visual Studio Express 2012中的一个项目。我们迄今为止仅为Win32(x86)平台构建,但我将.exe版本转换为64位。我现在有一个完全链接的.exe,但是在这个过程中发生了一件有趣的事情:入口点不再被调用。

(C ++,console)程序的入口点是在文件范围内声明的C ++函数,具有以下签名:int main(int argc, char * argv[])。从第1天开始,这个函数在x86可执行文件中很有用。它没有在x64上调用:

  • 链接器不会抱怨它无法找到入口点。
  • 加载程序不会抱怨它无法找到入口点。
  • 当我从命令行运行exe时,它会立即启动并退出,退出代码为127。
  • gdb,例如,表示“在启动程序退出时使用代码0xc000007b。”
  • stdout或stderr没有任何输出。
  • 如果我在main int * p(nullptr); *p = 5;中加入有趣的东西,程序就不会崩溃(即使没有这个我确定main()没有运行)。

可能导致此问题的原因是什么?我该怎么调试呢?我不确定在我的调试器中设置断点的位置,因为我的代码都没有运行...

3 个答案:

答案 0 :(得分:6)

0xc000007bSTATUS_INVALID_IMAGE_FORMAT。也就是说,操作系统甚至不会将二进制加载得足够远以开始执行它。

您的编辑设置可能有问题。但是,通常当我看到此错误时,问题出在64位应用程序中,试图动态链接到32位DLL。

检查您的库,并验证您的路径是否指向任何DLL的64位版本。

答案 1 :(得分:0)

errlook实用程序说127是“无法找到指定的过程。”在<winerror.h>中搜索该文本会产生ERROR_PROC_NOT_FOUND

这听起来像是一个DLL问题。

现在我不喜欢应用于main的术语“入口点”,因为应该怎样调用入口点,即您提供给链接器设置入口点的地址? 启动功能可能会更好。这不仅仅是狡辩:微软的技术作家已经如此彻底地混淆了自己,以至于现在可以庆祝20年关于PE入口点的错误且仅仅是自相矛盾的文件。我认为他们永远不会做对。

根据我的经验,

gdb非常不可靠,不是检查某些内容是否被调用的好工具。这是不可靠的,至少当它检测到我是用户时。而是在main

中做一个消息框或其他容易识别和保证的内容

答案 2 :(得分:-1)

您可以通过/ ENTRY编译器标志找到(并修改)exe的入口点。

http://msdn.microsoft.com/en-us/library/f9t8842e.aspx

在Visual Studio开发环境中设置此链接器选项

  1. 打开项目的“属性页”对话框。有关详细信息,请参阅设置Visual C ++项目属性。
  2. 单击链接器文件夹。
  3. 单击“高级”属性页。
  4. 修改入口点属性。