当使用运行时库作为DLL时,无法进入CRT代码

4

我正在使用Visual Studio 2015更新3版本,我有一个非常简单的、纯粹的Win32控制台C++“Hello World”程序,像这样,它没有任何其他目的,只是用来进行实验:

int main()
{
  printf("Hello world");
  char *test = (char*)malloc(100);
}

如果项目使用了多线程DLL运行库(项目属性 -> 配置属性 -> C/C++/-> 运行库: 多线程调试DLL(/MDd)),我就无法进入malloc函数。

但是当我将此设置更改为多线程调试(/MTd)时,进入 malloc 函数正常工作。

但是,能够成功进入 printf 函数。我自己代码内部的调试也能正常进行。

有没有一种方法可以允许我进入这个运行库DLL?


1
那个 DLL 是由微软构建的,你没有它的 PDB 文件。你需要通过启用微软的符号服务器来获取它。路径为:工具 > 选项 > 调试 > 符号。对于更新2,这个方法可以正常工作,但不确定更新3是否可行,我会等待大量的错误修复后再尝试。 - Hans Passant
@HansPassant,我刚试了一下,但是“Microsoft Symbol Servers”已经被选中了,这并不能解释为什么进入printf可以工作而进入malloc却不行。顺便说一句,我昨天安装了更新2,但是一旦安装完成,它就变成了实际上的更新3。我还没有尝试在早期版本的VS中进入malloc - Jabberwocky
Malloc()位于另一个DLL文件ucrtbased.dll中,该文件不应更改,结果可能因人而异。使用Debug > Windows > Modules并查看符号文件列以查看PDB的位置。删除它,以便下载新的副本。 - Hans Passant
这里没有任何人能够解决这个问题,你需要使用connect.microsoft.com来报告此问题。 - Hans Passant
常见属性/调试源文件 我有这样的路径: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\src\atl\ C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\src\mfc\ 所以我认为它们不是递归的。只有一个文件夹没有以''结尾。我添加了 C:\Program Files (x86)\Windows Kits\10\Source\10.0.10240.0\ucrt\ C:\Program Files (x86)\Windows Kits\10\Source\10.0.10240.0\ucrt\heap\ 但没有效果。ucrtbased.dll 10.0.10240.16384(th1.150709-1700) C:\Windows\System32\ucrtbased.dll N/A N/A 已加载符号。 - Liviu
显示剩余3条评论
2个回答

6
当ucrtbased.dll构建版本10.0.10240.0的符号发布到符号服务器时出现错误。最初,未剥离的符号(带有源信息)被发布到了符号服务器上,但是后来被剥离的符号覆盖了它们。
我们已经解决了这个问题,并重新发布了未剥离的符号。如果您现在尝试从符号服务器下载此DLL的符号,则应该获得未剥离的符号。
如果您已经下载了剥离的符号,则需要从符号缓存中删除它们,以便调试器考虑重新下载未剥离的符号。在Visual Studio中,转到“工具”=>“选项”,“调试”=>“符号”。那里有一个文本框,“在此目录中缓存符号。”关闭Visual Studio。在Windows资源管理器中打开该目录并搜索“ucrtbased”。删除搜索结果中的所有PDB文件。

这个问题似乎在crt版本10.0.10240.16384中重新出现了,这使得调试非常困难。 - Ofek Shilon

1
安装 Windows 10 SDK (它还会作为副作用更新 System32 中的 ucrtbased.dll)。

即使不像这里所示那样将目标更改为“Windows 10”,它也可以正常工作:"如何在 Windows 桌面应用程序中使用 Windows 10 SDK" - Liviu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接