龙空技术网

暴雪从Visual Studio调试Linux core文件

飞鱼在浪屿 582

前言:

当前各位老铁们对“visual studio 堆栈窗口”都比较珍视,小伙伴们都想要剖析一些“visual studio 堆栈窗口”的相关资讯。那么小编同时在网络上网罗了一些有关“visual studio 堆栈窗口””的相关知识,希望咱们能喜欢,小伙伴们一起来了解一下吧!

更多互联网新鲜资讯、工作奇淫技巧关注原创【飞鱼在浪屿】(日更新)

暴雪使用Visual Studio 2019在WSL上调试Linux core dump。

介绍

在《暗黑破坏神IV》上,暴雪在Windows上开发了所有代码,并可以在多个平台上进行编译。这包括运行在Linux上的服务器。(该代码在必要时包括条件编译和特定于定制平台的代码)。此工作流程有多种原因。一方面,服务器程序员也最熟悉Windows开发。另一个也是最重要的原因是Visual Studio提供的功能和强大的工具集。即使要在Linux上本机开发,在Linux世界中也没有什么可比的。

但是,这在部署的服务器崩溃时带来了一些挑战。调试生成的coredump,可以选择远程登录崩溃的VM(或是容器),然后运行gdb来诊断那里的崩溃。但是这样做有很多缺点。首先,使用二进制文件来部署源,因此在VM或容器上的gdb会话中源不可用。

另一个障碍是gdb本身:除非定期使用gdb,否则将无法保持一定的熟练程度。

希望有一种更直观的方法来调试Linux内核。这就是为什么能够利用新的Visual Studio功能,能够在熟悉的Visual Studio环境中做到这一点!

调试流程

仅当安装WSL或将Linux连接添加到Connection Manager时,才启用Visual Studio Linux核心调试工作流。服务器开发人员使用安装WSL,运行脚本,该脚本还安装了在WSL中构建服务器所需的所有开发工具和支持库。(WSL是开发人员可以在Linux版本中测试Linux环境。进入WSL,cd进入共享代码目录以及从那里直接构建。这比运行VM甚至是容器要好得多。如果使用CMake进行构建,则还可以利用Visual Studio对WSL的本机支持。)

Windows上开发代码,拥有可在Windows下运行的Windows版本的服务器。但是,在Linux上部署服务器,这需要在Linux本身上生成的构建。Linux构建是在构建服务器场上生成的,该构建服务器场使用Linux机器上的构建系统来构建服务器及其要部署的容器。Linux可执行文件仅部署在容器中,开发人员通常无法访问它。

当服务器在基础架构中崩溃时,自动化流程会通知,并将coredump存档到网络共享中。要在Linux或Visual Studio中调试core,必须具有正在运行的可执行文件。它还有助于调试已部署容器上使用的确切共享库。另一个脚本来获取这些文件。首先,将core复制到本地计算机,然后运行脚本并将其指向core。该脚本下载使用该版本构建的Docker容器,从中提取服务器二进制文件,以及某些共享的运行时库供gdb使用。(这避免了WSL版本与已部署的Linux版本不完全匹配时可能遇到的gdb兼容性问题。)

然后,切换到Visual Studio,加载sln项目以构建Windows版本的服务器。然后,在“调试”->“其他调试目标”->“仅使用本机调试Linux核心转储”下打开新的调试对话框。启用“在WSL上调试”复选框,并填写核心文件和服务器二进制文件的(特定于WSL!)路径。之后,我们点击“调试”并观察!

Visual Studio在后台调用WSL中的gdb,弹出一个崩溃的调用堆栈,指令指针位于相关代码行上。

接下来是识别崩溃的任务。有一个崩溃处理程序来拦截崩溃以执行一些内务处理,因此实际崩溃将落在单线程服务器中的调用堆栈中。但是,某些服务器是多线程的,崩溃可能是由这些线程中的任何一个引起的。崩溃处理程序记录了崩溃文件和行号的来源,因此检查这些变量将提供第一个线索。将查找执行该代码的调用堆栈。

使用gdb获取所有线程的回溯并仔细阅读结果列表,以查看哪个线程具有最有可能崩溃的调用堆栈。例如,如果一个线程仅在休眠,则很可能不是崩溃的线程。我们将寻找一个栈,其内容要多于用“睡眠”设置的几个帧,然后检查代码以查看问题是否明显,或者进入gdb本身以检查进程状态。

但是,Visual Studio提供了比其强大得多的选项。对于多线程core,可以在调试会话中打开“线程”窗口,并在每个线程中四处查看以查看堆栈的外观。这与gdb方法非常相似,如果有50个线程,可能会非常乏味。幸运的是,有一个功能可以使此操作变得更加容易:并行堆栈。

Parallel Stacks。调用Debug-> Windows-> Parallel Stacks(仅在调试会话期间可用)会打开一个新窗口,其中显示了进程中每个线程的调用堆栈。这是您整个过程空间的视图。可以双击任何线程中的任何堆栈框架,Visual Studio会在源和调用堆栈窗口中都跳转到该框架。这是一个非常节省的时间。

一旦可以看到崩溃附近的代码,就可以使用鼠标悬停,QuickWatch或Visual Studio中的其他任何工具检查变量。的确,在发布版本中,许多变量已被优化,但同时许多变量没有被优化!与使用gdb相比,使用Visual Studio界面可以更快地解决问题。

标签: #visual studio 堆栈窗口