【问题标题】:CopyFile() function causes exception while debugging but not while running from terminalCopyFile() 函数在调试时导致异常,但在从终端运行时不会
【发布时间】:2021-11-26 17:24:50
【问题描述】:

我有一个 Visual Studio 2019 项目,仅包含一个 .cpp 文件,名为 copyFile.cpp

#undef UNICODE

#include <iostream>
#include <Windows.h>

int main()
{
    std::cout << "Hello World!\n";

    DWORD ret = CopyFile("xyz.txt", "xyzCopy.txt", FALSE);
    printf("\n\t ret: %d, getlasterror(): %d", ret, GetLastError());
    
    return 0;
}

在调试代码时出现问题,越过这一行:

DWORD ret = CopyFile("xyz.txt", "xyzCopy.txt", FALSE);

导致抛出异常。

Exception thrown at 0x76E4B1AF (combase.dll) in copyFile.exe : 0xC0000005: Access violation reading location 0x00000008

然后程序中断。

与此同时,xyzCopy.txt 正在创建中,新的修改日期为空文件,0 KB。

另一方面,如果我通过终端通过./copyFile.exe 运行 .exe,则不会引发异常,并且代码继续执行到以下行。正在创建文件xyzCopy.txt,内容已满(非空),但创建的时间戳与原始文件相同。与调试时的情况对比。

另外,如果CopyFile() 失败,例如因为找不到要复制的源文件,调试工作正常。因此,只有CopyFile() 成功时才会出现问题。

我不知道是什么情况。感谢您的帮助。

【问题讨论】:

  • 您是否在正在调试的构建中激活了编译器优化?在使用调试器时,您通常应该只使用没有编译器优化的调试版本,否则调试器中显示的当前行可能会产生误导。
  • 您是否运行了防病毒程序?如果是这样,没有它会出现同样的怪事吗?
  • @muyustan:你的代码对我有效,除了我必须添加#include &lt;string&gt; 才能编译代码。我能够使用调试器通过CopyFile 调用越界,没有发生任何异常。文件已成功复制。我没有测试你的其余代码。我在 Windows 7 上使用 MS Visual Studio 2017。
  • 请提供minimal reproducible exampleGetLastErrorStdStr 可以完全删除。您没有以任何有意义的方式使用它,所以请摆脱它。

标签: c++ windows visual-studio winapi visual-studio-2019


【解决方案1】:

我找不到根本原因,但是,@SimonMourier 在他的 cmets 中发布了 link,这表明了一种可行的解决方法。

附加信息:切换调试选项“自动关闭 调试停止时的控制台”打开,停止异常 扔了。

【讨论】:

  • 很高兴您得到了解决方案,感谢您的分享,如果您将它们标记为答案,我将不胜感激,这将对其他社区有益。
  • @Jeaninez-MSFT 完成
猜你喜欢
  • 2018-03-24
  • 2017-09-03
  • 2020-01-13
  • 1970-01-01
  • 2019-02-10
  • 1970-01-01
  • 1970-01-01
  • 2018-06-19
  • 2019-11-12
相关资源
最近更新 更多