切换JIT调试器?

Jer*_*ers 5 windows delphi debugging visual-studio

当您必须使用不同的IDE维护不同的项目时,将它们安装在同一台Windows计算机上通常是有意义的.

例如,在同一系统上混合Visual Studio和Delphi,或各种版本的Delphi(我确信其他版本甚至有不同的组合).

你会发现其中一件事是最新工具将自己安装为JIT调试器:应用程序崩溃时触发的即时调试器.

根据应用程序崩溃的工具和版本(有时在调试器内运行时无法重现错误,例如Heisenbug),您需要提前选择调试器.

你怎么能这样做?

Ser*_*yuz 7

编写一个简单的应用程序,在应用程序崩溃时启动所需的调试器.

注册您的应用程序

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

如果是64位操作系统,也可以使用以下密钥

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

添加/修改Debugger以value 命名的字符串:

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

一个非常简单的应用:

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;
Run Code Online (Sandbox Code Playgroud)