【发布时间】:2012-09-23 21:49:08
【问题描述】:
对于这个问题中缺少代码 sn-ps 及其模糊性,我请求您耐心等待,但我完全一无所知,我对错误的位置没有任何线索,我无法粘贴整个应用程序。
我有一个跨平台应用程序,它通过普通的C API(fopen 等)打开一个文件,写入一些数据(首先将缓冲区传递给 zlib 以使其放气,但我不认为这是相关)持续一段时间,最后刷新并关闭它。
这在所有平台上都可以正常工作,除了在 Windows OS x64 上打开 UAC 的 64 位版本。基本上,在那个精确的设置中,在我打开文件和刷新它之间,文件缓冲区似乎与我发送到stdout 的内容交错,好像对stdout 的任何写入都使用了相同的缓冲区另一个文件。
重要的是要注意,这不应该与任何文件系统虚拟化(VirtualStore 机制)相关,正如我在%USERPROFILE%\Saved Games\ 中所写的那样。这个问题肯定与 UAC 有关,因为如果我关闭它,问题就不会发生。 wine64 也没有问题。
任何指针都是有价值的。编译器是g++ 4.7.0(从linux交叉编译)。
【问题讨论】:
-
你能发布一些示例代码吗?
-
当我说我不知道错误的位置,所以粘贴一些相关代码意味着粘贴整个应用程序时,我是认真的。
-
建议:你能用一个小的、独立的测试用例重现这个问题吗(例如:“
printf (some-text)/fopen (some-file-in-%userprofile%-saved-games)/fprintf (some-different-text)/fclose()”?问:“从 Linux 交叉编译 gcc 4.7.0”是什么意思?问:您是否尝试过直接在 Windows 上编译(例如使用 MSVC?) -
使用 sysinternals 的进程监视器来仔细查看真正写入的内容和位置
-
在这种情况下有时会有所帮助的一种方法是复制您的源代码,然后开始批量提取零件(根据需要用虚拟代码替换它们)直到出现 (a) 问题消失了,在这种情况下,您可以查看最近删除的代码以寻找线索;或 (b) 您有一个可以发布的独立测试用例。这可能是一项艰巨的工作,因此它是最后的手段,但如果调试没有为您提供所需的线索,它可能是您唯一的选择。