这个简单的请求变得非常复杂。 WinDbg 的窗口位置保存在工作区中。 WinDbg 有几个默认工作区:
- 基础 - 这是在您开始调试之前使用的工作区(未打开转储,未打开 exe,未附加任何内容)
- 每个转储文件 - 对于您打开的每个转储文件,您都有一个用于该文件的工作区
- 每个可执行文件 - 对于您打开的每个可执行文件。
- 用户模式 - 在实时用户模式调试时使用
- 内核模式 - 在内核模式调试时使用
- 每台机器架构 - 1 个用于 x64,1 个用于 x86,1 个用于 IA64
- Remote - 在远程调试时使用
对于任何给定类型的调试(即实时用户模式或事后转储分析),您通常会得到基本设置+您的调试类型的组合。
如果你打开一个转储文件,你会得到 BASE+Per 转储文件
如果您进行用户模式调试,您将获得 BASE+用户模式
如果你实时内核调试 x64 机器,你会得到 BASE+Kernel-mode+x64
您在任何给定模式下所做的所有更改都会保存在最后重叠的工作区中。这意味着如果我们打开一个转储文件(因此我们是 Base+Per 转储),对设置的任何更改都将保存在此转储的工作区中。
除了内置工作区及其所有组合之外,还有命名(客户)工作区。这些将是当您转到“文件”>“保存工作区”时,并提供一个名称来保存所有设置,然后您可以使用 -W 命令行参数在启动 Windbg 时启用这些设置。
回到你的问题。如何让 .cmdtree 打开?在基本工作区中,您不能。许多窗口仅在调试器不处于休眠状态(在其 BASE 工作区中)时才可用。一旦调试器进入其任何活动状态,这些窗口就可用。
您遇到的问题是,为了按照您想要的方式进行所有设置,您必须让调试器处于活动状态(打开 exe、打开转储、实时调试)以及何时保存您的窗口布局,它还将保存您打开的 exe,或转储,或您正在执行的实时调试。
您最好的选择是只做您已经在做的事情,即只使用注册表中的 -c (HKEY_CLASSES_ROOT\WinDbg.DumpFile.1\shell\Open\command)。这将允许您在每次进行转储分析时双击转储并获取这些命令行选项。然后,您可以创建一个包含命令行的 windbg 快捷方式,以便将这些设置应用于您执行的其他类型的调试。
这是我上面 regkey 的命令行:
"c:\debuggers\x64\windbg.exe" -z "%1" -Q -W Internal -c ".load winde.dll;.enable_unicode 1;.ignore_missing_pages 1;.logopen /t C:\用户\jasone\Logs\debug.log;aS .p .process /p /r;aS .t .thread /p /r;aS !p !process;aS !t !thread;aS .f .frame;aS dv dv /V /i /t; aS .f .frame"
这是做什么的?
启动调试器,附加到转储文件,不提示保存工作区设置,打开我的“内部”工作区(我创建的命名工作区),并运行这些命令以加载调试器扩展、设置首选项并创建别名我的生活更轻松。