使用 windbg 调试 .net 应用程序,无法插入断点
Debugging .net application with windbg, cannot insert breakpoints
我使用 windbg 来调试一个简单的 C# 应用程序,它只包含如下所示的空形式:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApp2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
}
我编译,运行这个应用程序,用windbg附加到它,然后在windbg中运行:
0:009> .cordll -ve -u -l
Automatically loaded SOS Extension
CLRDLL: Loaded DLL C:\Windows\Microsoft.NET\Framework64\v2.0.50727\mscordacwks.dll
CLR DLL status: Loaded DLL C:\Windows\Microsoft.NET\Framework64\v2.0.50727\mscordacwks.dll
然后我加载 SOS 扩展程序并验证其已加载:
0:009> .loadby sos mscorwks
0:009> .chain
Extension DLL search Path:
C:\Program Files (x86)\Windows Kits\Debuggers\x64\WINXP;C:\Program Files (x86)\Windows Kits\Debuggers\x64\winext;C:\Program Files (x86)\Windows Kits\Debuggers\x64\winext\arcade;C:\Program Files (x86)\Windows Kits\Debuggers\x64\pri;C:\Program Files (x86)\Windows Kits\Debuggers\x64;C:\Users\username\AppData\Local\Dbg\EngineExtensions;C:\Program Files (x86)\Windows Kits\Debuggers\x64;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files\PuTTY\;C:\Program Files (x86)\Bitvise SSH Client;C:\Program Files\nodejs\;C:\Program Files\Microsoft SQL Server0\Tools\Binn\;C:\Program Files\Git\cmd;C:\Users\username\AppData\Local\Android\sdk\platform-tools;C:\Program Files (x86)\Nox\bin\;C:\Users\username\AppData\Local\Microsoft\WindowsApps;C:\Users\username\AppData\Roaming\npm;C:\Program Files (x86)\Nmap;C:\Program Files (x86)\mitmproxy\bin
Extension DLL chain:
C:\Windows\Microsoft.NET\Framework64\v2.0.50727\sos: image 2.0.50727.8794, API 1.0.0, built Tue Jun 20 23:15:41 2017
[path: C:\Windows\Microsoft.NET\Framework64\v2.0.50727\SOS.dll]
C:\Windows\Microsoft.NET\Framework64\v2.0.50727\SOS.dll: image 2.0.50727.8794, API 1.0.0, built Tue Jun 20 23:15:41 2017
[path: C:\Windows\Microsoft.NET\Framework64\v2.0.50727\SOS.dll]
dbghelp: image 10.0.15063.468, API 10.0.6, built Thu Jan 1 03:00:00 1970
[path: C:\Program Files (x86)\Windows Kits\Debuggers\x64\dbghelp.dll]
ext: image 10.0.15063.468, API 1.0.0, built Thu Jan 1 03:00:00 1970
[path: C:\Program Files (x86)\Windows Kits\Debuggers\x64\winext\ext.dll]
exts: image 10.0.15063.468, API 1.0.0, built Thu Jan 1 03:00:00 1970
[path: C:\Program Files (x86)\Windows Kits\Debuggers\x64\WINXP\exts.dll]
uext: image 10.0.15063.468, API 1.0.0, built Thu Jan 1 03:00:00 1970
[path: C:\Program Files (x86)\Windows Kits\Debuggers\x64\winext\uext.dll]
ntsdexts: image 10.0.15063.468, API 1.0.0, built Thu Jan 1 03:00:00 1970
[path: C:\Program Files (x86)\Windows Kits\Debuggers\x64\WINXP\ntsdexts.dll]
然后我将调试符号路径设置为 .pdb
所在的文件夹和源文件夹。
但是当我打开源文件并在源代码行上设置断点,然后继续该过程时,我在 windbg 中遇到错误:
0:009> g
Unable to insert breakpoint 3 at 00000000`008f001a, Win32 error 0n998
"Invalid access to memory."
bp3 at 00000000`008f001a failed
WaitForEvent failed
我预计它会中断,并向我展示 .net
汇编指令,但它一直失败。那么,如何使用 windbg 对 .net 应用程序进行断点?
您不能在 .NET 中使用 F9 在源文件上设置断点。相反,您需要 SOS !bpmd
或 SOSEX !mbp
命令。
SOS 语法是
!BPMD <module name> <method name>
!BPMD -md <MethodDesc>
而且不能使用行号。
SOSEX 语法是
!sosex.mbp <source file> <line number> [<column number>] [Options]
如果 PDB 可用,可以使用行号。
!mbc
清除托管断点。 !mbd
禁用托管断点,!mbl
列出托管断点。
如果我没记错的话,这是有区别的:!bpmd
仅当方法已经过 JIT 编译时才有效,因此可以在可执行机器代码中设置断点。 !mbp
尽管该方法不是 JIT 编译的,但可以设置断点。一旦方法被编译,它就会自己设置断点。
我使用 windbg 来调试一个简单的 C# 应用程序,它只包含如下所示的空形式:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApp2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
}
我编译,运行这个应用程序,用windbg附加到它,然后在windbg中运行:
0:009> .cordll -ve -u -l
Automatically loaded SOS Extension
CLRDLL: Loaded DLL C:\Windows\Microsoft.NET\Framework64\v2.0.50727\mscordacwks.dll
CLR DLL status: Loaded DLL C:\Windows\Microsoft.NET\Framework64\v2.0.50727\mscordacwks.dll
然后我加载 SOS 扩展程序并验证其已加载:
0:009> .loadby sos mscorwks
0:009> .chain
Extension DLL search Path:
C:\Program Files (x86)\Windows Kits\Debuggers\x64\WINXP;C:\Program Files (x86)\Windows Kits\Debuggers\x64\winext;C:\Program Files (x86)\Windows Kits\Debuggers\x64\winext\arcade;C:\Program Files (x86)\Windows Kits\Debuggers\x64\pri;C:\Program Files (x86)\Windows Kits\Debuggers\x64;C:\Users\username\AppData\Local\Dbg\EngineExtensions;C:\Program Files (x86)\Windows Kits\Debuggers\x64;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files\PuTTY\;C:\Program Files (x86)\Bitvise SSH Client;C:\Program Files\nodejs\;C:\Program Files\Microsoft SQL Server0\Tools\Binn\;C:\Program Files\Git\cmd;C:\Users\username\AppData\Local\Android\sdk\platform-tools;C:\Program Files (x86)\Nox\bin\;C:\Users\username\AppData\Local\Microsoft\WindowsApps;C:\Users\username\AppData\Roaming\npm;C:\Program Files (x86)\Nmap;C:\Program Files (x86)\mitmproxy\bin
Extension DLL chain:
C:\Windows\Microsoft.NET\Framework64\v2.0.50727\sos: image 2.0.50727.8794, API 1.0.0, built Tue Jun 20 23:15:41 2017
[path: C:\Windows\Microsoft.NET\Framework64\v2.0.50727\SOS.dll]
C:\Windows\Microsoft.NET\Framework64\v2.0.50727\SOS.dll: image 2.0.50727.8794, API 1.0.0, built Tue Jun 20 23:15:41 2017
[path: C:\Windows\Microsoft.NET\Framework64\v2.0.50727\SOS.dll]
dbghelp: image 10.0.15063.468, API 10.0.6, built Thu Jan 1 03:00:00 1970
[path: C:\Program Files (x86)\Windows Kits\Debuggers\x64\dbghelp.dll]
ext: image 10.0.15063.468, API 1.0.0, built Thu Jan 1 03:00:00 1970
[path: C:\Program Files (x86)\Windows Kits\Debuggers\x64\winext\ext.dll]
exts: image 10.0.15063.468, API 1.0.0, built Thu Jan 1 03:00:00 1970
[path: C:\Program Files (x86)\Windows Kits\Debuggers\x64\WINXP\exts.dll]
uext: image 10.0.15063.468, API 1.0.0, built Thu Jan 1 03:00:00 1970
[path: C:\Program Files (x86)\Windows Kits\Debuggers\x64\winext\uext.dll]
ntsdexts: image 10.0.15063.468, API 1.0.0, built Thu Jan 1 03:00:00 1970
[path: C:\Program Files (x86)\Windows Kits\Debuggers\x64\WINXP\ntsdexts.dll]
然后我将调试符号路径设置为 .pdb
所在的文件夹和源文件夹。
但是当我打开源文件并在源代码行上设置断点,然后继续该过程时,我在 windbg 中遇到错误:
0:009> g
Unable to insert breakpoint 3 at 00000000`008f001a, Win32 error 0n998
"Invalid access to memory."
bp3 at 00000000`008f001a failed
WaitForEvent failed
我预计它会中断,并向我展示 .net
汇编指令,但它一直失败。那么,如何使用 windbg 对 .net 应用程序进行断点?
您不能在 .NET 中使用 F9 在源文件上设置断点。相反,您需要 SOS !bpmd
或 SOSEX !mbp
命令。
SOS 语法是
!BPMD <module name> <method name>
!BPMD -md <MethodDesc>
而且不能使用行号。
SOSEX 语法是
!sosex.mbp <source file> <line number> [<column number>] [Options]
如果 PDB 可用,可以使用行号。
!mbc
清除托管断点。 !mbd
禁用托管断点,!mbl
列出托管断点。
如果我没记错的话,这是有区别的:!bpmd
仅当方法已经过 JIT 编译时才有效,因此可以在可执行机器代码中设置断点。 !mbp
尽管该方法不是 JIT 编译的,但可以设置断点。一旦方法被编译,它就会自己设置断点。