5

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

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

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

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

你怎么能那样做?

4

3 回答 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
 

一个非常简单的应用程序:

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;
于 2012-10-05T16:01:26.067 回答
2

如果您搜索 Microsoft 文档,您可以看到事后调试可以通过 \HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AeDebug 下的注册表项进行控制

http://msdn.microsoft.com/en-us/library/windows/hardware/ff542967(v=vs.85).aspx

如果要手动更改,则需要特别注意。

于 2012-10-05T08:56:22.480 回答
1

我认为,如果您确实需要调试使用不同工具制作的多个同时运行的应用程序 - 那么您唯一的选择是找到或创建一个桥接 JIT 调试器,该调试器将分析哪个项目崩溃并将控制权中继到相应的 IDE 调试器

于 2012-10-05T07:50:40.150 回答