切换JIT调试器?

5
当你需要使用不同的IDE来维护不同的项目时,将它们安装在同一台Windows机器上是有意义的。例如,混合使用Visual Studio和Delphi,或在同一系统上使用各种版本的Delphi(我相信其他人甚至有不同的组合)。其中一个事情是,最新的工具会将自己安装为JIT调试器:即当应用程序崩溃时会触发的即时调试器。根据应用程序崩溃时所使用的工具和版本(有时你无法在调试器内运行时重现错误,例如在Heisenbug的情况下),您需要提前选择调试器。你怎么做呢?

JIT调试器已在注册表中设置,这很丑陋 - 但您的应用程序可以在启动时更改它。尽管在并行运行多个不同的应用程序时,这并没有什么帮助。 - Arioch 'The
为了设置Delphi IDE,不需要安装多个版本,可以参考这篇文章中的信息。该链接指向codegear.com网站,但在我撰写此文本时仍可正常访问。该文章涉及旧版Delphi,但可以轻松更新以适用于新版。 - Ken White
谢谢,这是 Embarcadero 的链接,应该会更长久存在:http://support.embarcadero.com/article/36747 - Jeroen Wiert Pluimers
3个回答

7

编写一个简单的应用程序,以便在应用程序崩溃时启动您想要的调试器。

在以下位置注册您的应用程序:

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug

对于64位操作系统,请还需添加以下键:

HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug

添加/修改名为Debugger的字符串值:

"C:..\Win32\Debug\Project1.exe" %ld %ld

A very simple application:

procedure TForm1.FormCreate(Sender: TObject);
begin
  ComboBox1.Items.Add('BDS 16');
  ComboBox1.Items.Add('BDS 15');
  ComboBox1.Items.Add('WinDbg');
  ComboBox1.Items.Add('VS');
  // etc..
  ComboBox1.ItemIndex := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  proc: THandle;
begin
  Assert(ParamCount >= 2);
  proc := OpenProcess(SYNCHRONIZE, False, StrToInt(ParamStr(1)));
  case ComboBox1.ItemIndex of
    0: ShellExecute(0, '', 'C:\..\RAD Studio\9.0\bin\bds.exe',
          PChar(Format('/attach:%s;%s', [ParamStr(1), ParamStr(2)])), '',
          SW_SHOWNORMAL);
    1 : // etc..
    2: ShellExecute(0, '', 'C:\Program Files (x86)\..\windbg.exe',
          PChar(Format('-p %s -e %s -g', [ParamStr(1), ParamStr(2)])), '',
          SW_SHOWNORMAL);
    3: ShellExecute(0, '', 'C:\Windows\system32\VSJitDebugger.exe',
          PChar(Format('-p %s -e %s', [ParamStr(1), ParamStr(2)])), '',
          SW_SHOWNORMAL);
    //..
  end;
  if Bool(proc) then begin
    WaitForSingleObject(proc, INFINITE);
    Application.Terminate;
  end;
end;


2

我需要特别注意哪些事项? - Jeroen Wiert Pluimers
不当更改注册表可能导致Windows无法使用。所有Microsoft调试器都有自己的命令行开关或选项页面,以将自己注册为死后调试器。使用这种自动方式可以避免在编辑注册表时出现错误。不确定Delphi是否也提供了这样的自动方式。 - Lex Li
基本上我应该这样做:1.安装每个工具,记下注册表设置,2.安装下一个,3.回到1;最后制作一个小切换应用程序,将注册表设置为我想要使用的工具。 - Jeroen Wiert Pluimers
如果您想要这种灵活性,那么编写这样的工具应该会有所帮助。目前还没有找到现成的工具。 - Lex Li

1

我认为,如果您真的需要调试使用不同工具制作的多个并发运行的应用程序,则您唯一的选择是找到或创建一个桥接JIT调试器,该调试器将分析哪个项目崩溃并将控制传递给相应的IDE调试器。


通常我知道会崩溃的原因,所以手动更改JIT调试器的步骤结合提示就足够了。 - Jeroen Wiert Pluimers

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