当你需要使用不同的IDE来维护不同的项目时,将它们安装在同一台Windows机器上是有意义的。例如,混合使用Visual Studio和Delphi,或在同一系统上使用各种版本的Delphi(我相信其他人甚至有不同的组合)。其中一个事情是,最新的工具会将自己安装为JIT调试器:即当应用程序崩溃时会触发的即时调试器。根据应用程序崩溃时所使用的工具和版本(有时你无法在调试器内运行时重现错误,例如在Heisenbug的情况下),您需要提前选择调试器。你怎么做呢?
编写一个简单的应用程序,以便在应用程序崩溃时启动您想要的调试器。
在以下位置注册您的应用程序:
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;
http://msdn.microsoft.com/en-us/library/windows/hardware/ff542967(v=vs.85).aspx
如果你想手动更改它,就需要特别注意。我认为,如果您真的需要调试使用不同工具制作的多个并发运行的应用程序,则您唯一的选择是找到或创建一个桥接JIT调试器,该调试器将分析哪个项目崩溃并将控制传递给相应的IDE调试器。