当您必须使用不同的 IDE 维护不同的项目时,将它们安装在同一台 Windows 机器上通常是有意义的。
例如,在同一系统上混合使用 Visual Studio 和 Delphi,或各种版本的 Delphi(我相信其他人甚至有不同的组合)。
您会发现其中一件事是最新的工具将自己安装为 JIT 调试器:当应用程序崩溃时触发的即时调试器。
根据应用程序崩溃的工具和版本(有时在调试器中运行时您无法重现错误,例如在 Heisenbug 的情况下),您需要提前选择调试器。
你怎么能那样做?
当您必须使用不同的 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
一个非常简单的应用程序:
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;
如果您搜索 Microsoft 文档,您可以看到事后调试可以通过 \HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AeDebug 下的注册表项进行控制
http://msdn.microsoft.com/en-us/library/windows/hardware/ff542967(v=vs.85).aspx
如果要手动更改,则需要特别注意。
我认为,如果您确实需要调试使用不同工具制作的多个同时运行的应用程序 - 那么您唯一的选择是找到或创建一个桥接 JIT 调试器,该调试器将分析哪个项目崩溃并将控制权中继到相应的 IDE 调试器