在VC ++ 2010环境之外运行时程序立即崩溃

时间:2014-01-01 19:04:17

标签: c++ windows visual-studio-2010 debugging crash

我有一个我已经工作了几个星期的程序,过去几天我做了一些很大的改动,我现在无法弄清楚为什么程序不能在VC +之外工作+2010环境。

当我打开项目时,程序运行完美,从Solution Configurations下拉列表中选择Release或Debug,然后点击F5。但是当我从Release / Debug文件夹中获取可执行文件时,将其放在可以访问我正在使用的资源的位置,然后运行它,它会加载几秒钟,然后显示这个可爱的错误“Project.exe has停止工作 - Windows正在检查问题的解决方案......“当然,像往常一样,Windows无法找到问题的解决方案。

在您阅读所有这些代码之前的快速免责声明:虽然错误是由代码更改引起的,但是由于我一次更改了一些内容而导致它的变化是值得怀疑的 - 我知道这是愚蠢的,但它发生了。我发布了最可能的错误来源的代码。如果您信任我的编码习惯,请滚动到“我的第二个想法:”。


我最近做出的最大改变涉及我的输入处理程序,并通过函数指针集成了键绑定(我没有任何经验)。我在RawInput类中定义了一个函数指针数组,如下所示:

typedef  void (Application::*AppFunc)(void);
typedef  void (Application::*AppFuncDelta)(int delta);

AppFunc onKeyPress[256];
AppFunc onKeyRelease[256];
AppFunc onMouseButtonPress[5];
AppFunc onMouseButtonRelease[5];

AppFuncDelta onMouseMove[3];

我已通过直接在其自己的类定义之上声明原型来向RawInput类提醒Application类,如下所示:

class Application;

我在Application::Initialize()中填写了这些数组(我定义了很多键,所以这里是摘录):

m_RawInput->onMouseMove[0] = &Application::mouseMoveX;
m_RawInput->onMouseMove[1] = &Application::mouseMoveY;

其中Application::mouseMoveXApplication::mouseMoveY函数采用int参数并且不返回值。

这些函数在RawInput::Interpret(LPARAM lParam)内部调用,如下所示:

if (raw->data.keyboard.Flags & RI_KEY_BREAK) //key released
{
    if (onKeyRelease[raw->data.keyboard.VKey] && g_app) (g_app->*onKeyRelease[raw->data.keyboard.VKey])();
    return;
}
else //key pressed down
{
    if (onKeyPress[raw->data.keyboard.VKey] && g_app) (g_app->*onKeyPress[raw->data.keyboard.VKey])();
    return;
}

g_appinput.cpp中定义为extern Application *g_app。我从程序的概念开始就使用g_app,这绝对不是问题。

我对此更新的第一个问题在于空函数指针,但现在我在调用任何函数之前检查指定函数的有效性和g_app的有效性。无论如何,这个错误会发生在VC ++环境内外,我怀疑它不是问题。


我在自己询问之前搜索了一会儿,并在Stack Overflow上发现了这个nearly identical question。对我来说可悲的是,它仍然没有答案。


我还发现了this tool(称为依赖性walker),它遍历可执行文件的所有依赖项,并让您知道是否找不到其中一些。它找不到(我找不到确定版本的)这些DLL:

API-MS-WIN-APPMODEL-RUNTIME-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-ERROR-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-ROBUFFER-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-STRING-L1-1-0.DLL
API-MS-WIN-SHCORE-SCALING-L1-1-1.DLL
DCOMP.DLL
GPSVC.DLL
IESHIMS.DLL

我的两个想法之一是RawInput无法调用它不知道的函数 - 并且它不知道Application中的任何函数。但是我当前的#include层次结构使RawInput很难了解这些功能。

我的第二个想法:

只有3件事(根据Vivian De Smedt)在IDE内部或外部运行时会发生变化:

1。)传递给程序的参数。 //perhaps

2。)应用程序的工作目录。 //has not changed

3。)环境变量,如果你在启动Visual Studio之后更改了它们(或者如果你使用这样的启动器启动了启动器之后:例如:Explorer ++)//I suspect this to be the problem. Ideas?


我在这个问题上彻底迷失了,我花了很多时间来撰写这个问题。任何建议都非常感谢。我会在15分钟左右,所以如果我在任何地方失去你,请要求澄清:)

2 个答案:

答案 0 :(得分:2)

xP抱歉浪费你的时间,伙计们。我完全带领你走错了方向。除以0是由于%运算符位于两个未初始化变量的中间。

对于阅读此内容的人来说,这是一件有趣的事情:

uninitialized_variable1 % uninitialized_variable2是一个没有附加调试器的错误,而它在调试器的环境中评估为零。

答案 1 :(得分:0)

这样做。让我们假装您将EXE命名为Foo.exe。

  1. 执行项目的完整清理构建并进行新的Debug构建。

  2. Foo.exe Foo.pdb 的Debug版本复制到您无法运行的其他目录。

    < / LI>
  3. 启动Visual Studio,但没有打开任何项目。

  4. 从“文件”菜单中选择“文件” - &gt;打开项目/解决方案。

  5. 将Open Project控制器导航到您将二进制文件复制到的目录。

  6. 选择Foo.exe作为项目。这将为您编译的二进制文件启动一个调试项目。

  7. 现在按照惯例开始调试(例如按F11 - Step Into)。如果一切顺利,您将调试会话分为main或WinMain的第一行。系统可能会提示您输入源目录的位置,但是您应该能够以与项目放置目录不足相同的方式调试项目。 (根据需要设置断点,继续,单步执行,观察变量等。)