切换JIT调试器?

时间:2012-10-05 07:41:15

标签: windows visual-studio delphi debugging

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

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

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

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

你怎么能这样做?

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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

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

答案 2 :(得分:1)

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