为XBox开发者提供的ASan早期发布版本
本文来自XBox Advanced Technology Group (ATG)的首席软件工程师Tad Switf。
介绍
Address Sanitizer (ASan) 是一款用来查找难以追踪的内存相关Bug的利器。自从Visual Studio 16.9中的MSVC发布开始,我们一直和我们的合作伙伴一起并肩工作,目标是将ASan这个工具带到XBox平台。
随着最近发布的XBox六月GDK,我们很高兴地宣布:Address Sanitizer的早期发布版本正式可用。
在今天的这边文章中,我们将会展示如何在XBox平台上使用ASan工具。
使用Address Sanitizer进行编译
在XBox工程上配置ASan基本和PC版本一致,因为Address Sanitizer已经被集成进Visual Studio的调试工具集中了。但是,对于XBox开发者来说,还是会有一些特殊的场景是默认配置下的ASan所不能支持的。

现代游戏由高度复杂的多线程代码组成,其目标是在保持目标帧速率的同时尽可能快地运行。 这意味着,通过自动化构建和测试设置的全过程中,开发人员会经常需要测试自己的代码。 这些服务器可以构建代码,将其部署到控制台,并在没有调试器连接的情况下运行游戏,这意味着它们可能会错过调试输出中显示的任何ASan相关的错误报告。理想情况下,测试服务器可以从任何 Asan 错误中收集故障信息,但由于XBox GDK的差异,必须采取额外的步骤从自动运行中提取Address Sanitizer 的故障信息。
增强的调试支持
MSVC的ASan实现可以创建包含详细异常信息的故障转储,但这只能从XBox不支持的环境变量中启用。为了能够在XBox上获取故障转储,开发人员必须在其代码中指定一个函数来提供转储文件名。
以下是关于这个函数的两个例子:

关于这个函数的返回的名称,系统没有具体的要求,但它必须是运行代码的目标设备上的一个有效文件路径。
既然我们可以在Xbox上支持故障转储,我们还决定为开发人员提供更多的灵活性,来处理所产生的故障转储类型。
在某些情况下,简单的”分类”转储足以查看进程失败的调用堆栈,但在游戏中,通常需要在问题发生时查看更多内存地址空间里的数据。为此,我们提供了三种可配置的故障转储类型,它们受XBox平台支持,并且与开发人员期望从他们的XBox游戏机获得的故障转储相匹配。
请注意:与之前的功能一样,这个配置在XBox上是可选的,但如果你想使用故障转储来收集ASan信息而不附加调试器,则我们强烈建议你这样做。 如果你提供转储文件名但未提供转储类型配置,则它将无法在XBox上生成有效的故障转储文件。
此回调函数返回一个数字以指示所需的转储类型。有效类型列表,如下图所示:

这两个回调函数都可以在Visual Studio 16.9.8、16.10.2 或即将发布的16.11预览版中找到。
例子代码
下面的例子代码,演示了将这些函数添加到现有代码库中,我们可以根据需要进行调整,如下图所示:

请使用如下的命令进行编译:

这段代码在运行的时候,应该会抛出一个ASan异常,并产生我们上面函数指定的故障转储文件。
你可以将这些功能集成到现有代码中,并生成你需要的故障转储。
总结
Address Sanitizer现在可在XBox上使用了,开发人员可以利用这项强大的技术,来帮助调试游戏中的内存问题。
而对于内存相关的Bug,确实十分难以调试,所以,请善用ASan,让生活变得容易一些。

最后
Microsoft Visual C++团队的博客是我非常喜欢的博客之一,里面有很多关于Visual C++的知识和最新开发进展。大浪淘沙,如果你对Visual C++这门古老的技术还是那么感兴趣,则可以经常去他们那(或者我这)逛逛。
本文来自:《Address Sanitizer Now in “Early Release” for Xbox Developers》
最近我写了个东西
正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。
- 下一篇: STL可视化调试工具
- 上一篇: 关于列表控件的定位属性
相关推荐
- 快讯:C++/CLI和.NET Core 3的未来
- Posted on 09月25日
- 长标题: 为调试,启动和CMake工具设置环境变量
- Posted on 11月19日
- 错误信息:Windows任务因登录失败而未能执行
- Posted on 09月16日
- 最好不要依赖编译器的内存自动初始化功能
- Posted on 05月09日



评论已关闭。