【问题标题】:First-chance exception: KernelBase.dll第一次机会异常:KernelBase.dll
【发布时间】:2013-02-15 07:42:26
【问题描述】:

我正在尝试使用 VS2012 Pro 构建和运行这个程序。

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    //allocate memory
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));

    //create child process
    if (!CreateProcess(NULL,    //use command line
             L"mspaint.exe",    //command line
             NULL,    //don't inherit process handle
             NULL,    //don't inherit thread handle
             FALSE,    //disable handle inheritance
             0,        //no creation flags
             NULL,    //use parent's environment block
             NULL,    //use parent's existing directory
             &si,
             &pi))
    {
        fprintf(stderr, "Create Process Failed");
        return -1;
    }
    WaitForSingleObject(pi.hProcess, INFINITE);
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);

    return 0;
}

我收到此错误:

“ConsoleApplication1.exe”(Win32):已加载“G:\workspace\VS2012\ConsoleApplication1\Debug\ConsoleApplication1.exe”。已加载符号。

“ConsoleApplication1.exe”(Win32):已加载“C:\Windows\SysWOW64\ntdll.dll”。无法找到或打开 PDB 文件。

“ConsoleApplication1.exe”(Win32):已加载“C:\Windows\SysWOW64\kernel32.dll”。无法找到或打开 PDB 文件。

“ConsoleApplication1.exe”(Win32):已加载“C:\Windows\SysWOW64\KernelBase.dll”。无法找到或打开 PDB 文件。

“ConsoleApplication1.exe”(Win32):已加载“C:\Windows\SysWOW64\msvcr110d.dll”。已加载符号。

ConsoleApplication1.exe 中 0x763919E3 (KernelBase.dll) 的第一次机会异常:0xC0000005:访问冲突写入位置 0x00CB586E。

ConsoleApplication1.exe 中 0x763919E3 (KernelBase.dll) 处的未处理异常:0xC0000005:访问冲突写入位置 0x00CB586E。

程序“[6992] ConsoleApplication1.exe”已退出,代码为 0 (0x0)。

请注意,我构建它没有错误(文件 stdafx.h 包含我需要的所有标题)。

我搜索了这个错误,但找不到任何解决方案,而且这只是一个简单的程序,所以我无法理解这里的问题:(。

请帮帮我。

【问题讨论】:

  • 您是否尝试过先调试您的程序?尝试使用 mspaint.exe 的完整路径。
  • 谢谢,但“system32”文件夹始终是系统尝试查找您调用的任何可执行文件的第一个文件夹:)。而且我必须调试程序才能得到错误“第一次机会异常......”否则,我用 GCC (mingw) 构建并运行了相关代码,没有错误。
  • 访问冲突意味着,您试图访问内存中无效的位置(例如 NULL 指针)。在 WaitForSingleObject 之前插入一个断点,并查看程序是否设法到达那里(按 F5 进行调试)。
  • 您是否尝试过阅读 CreateProcess 的文档?不?您可能想阅读它说 CreateProcess 的命令行参数必须由进程写入的位。而且你的常量字符串是不可写的。
  • 相关部分是这样的:这个函数的Unicode版本,CreateProcessW,可以修改这个字符串的内容。因此,此参数不能是指向只读内存的指针(例如 const 变量或文字字符串)。如果此参数是一个常量字符串,该函数可能会导致访问冲突。

标签: c visual-studio-2010 winapi access-violation


【解决方案1】:

来自 CreateProcessW 文档,特别是关于您的第二个参数:

此函数的 Unicode 版本 CreateProcessW 可以修改此字符串的内容。因此,此参数不能是指向只读内存的指针(例如 const 变量或文字字符串)。如果这个参数是一个常量字符串,该函数可能会导致访问冲突

所以在回答你的问题时,不要将常量字符串文字作为第二个参数传递给该函数,否则你会得到一个 AV。

【讨论】:

  • 谢谢,我解决了问题:)
  • 但现在的问题是“运行时检查失败 #2 - 变量 'progPath' 周围的堆栈已损坏。”
  • @SandDust:看起来您的代码中存在堆栈溢出。您是否在缓冲区中放入了太多字符?
  • 我认为没有,我使用'progPath'来存储可执行文件的路径:wchar_t progPath; wcout
  • 在您刚刚发布的代码中,progPath 是一个只有一个字符的缓冲区。你可能想要更像 wchar_t progPath[MAX_PATH]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
  • 2014-06-27
  • 1970-01-01
  • 2013-03-14
  • 1970-01-01
相关资源
最近更新 更多