我正在使用VS.NET 2010.我编译了一个非常简单的.NET 4.0应用程序.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TestWindbg
{
class Program
{
static void Main(string[] args)
{
Console.ReadLine();
Func1();
}
static void Func1()
{
int i = 0;
int j = i + 2;
Console.WriteLine(j);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我打开windbg 6.12.0002.633编译的可执行文件.键入以下命令以加载sosex
.loadby sosex clr
Run Code Online (Sandbox Code Playgroud)
然后,键入以下命令以设置断点
!mbm TestWindbg.Program.Func1
!mbp Program.cs 16
Run Code Online (Sandbox Code Playgroud)
然后运行该程序.没有一个破发点被击中.
任何的想法?
*编辑*
在这里,我根据Marc的要求粘贴有关我的环境的更多详细信息
0:004> !mbl
1 eu: disable *!TESTWINDBG.PROGRAM.FUNC1 ILOffset=0: pass=1 oneshot=false thread=ANY
2 eu: disable Program.cs, line 16: pass=1 oneshot=false thread=ANY
0:004> .chain
Extension …Run Code Online (Sandbox Code Playgroud) 我有一个OutOfMemoryException,我想分析应该创建的数组的大小和类型.
我为这种情况创建了一个演示目的转储,我能够获得以下信息:
0:000> !pe
Exception object: 023f389c
Exception type: System.OutOfMemoryException
Message: <none>
InnerException: <none>
StackTrace (generated):
SP IP Function
0015EE44 0099007F OOM2!OOM2.Program.Main()+0xf
StackTraceString: <none>
HResult: 8007000e
0:000> !u 0099007F
Normal JIT generated code
OOM2.Program.Main()
Begin 00990070, size 22
00990070 baffffff7f mov edx,7FFFFFFFh
00990075 b90241a478 mov ecx,offset mscorlib_ni+0x4102 (78a44102)
0099007a e8192194ff call 002d2198 (JitHelp: CORINFO_HELP_NEWARR_1_VC)
>>> 0099007f 8bc8 mov ecx,eax
...
Run Code Online (Sandbox Code Playgroud)
所以我可以看到创建了一个新数组,大小为7FFFFFFF,这是20亿个项目.(请忽略这样一个事实:您甚至无法在32位.NET应用程序中创建该大小的byte [],因此在此示例中类型可能根本不重要.)
我现在已经读过数组的类型在ECX寄存器中,但遗憾的mscorlib_ni+0x4102 (78a44102)是不是很有帮助.
我尝试过!mln,!mdt甚至不切实际!ip2mt,但没有一个显示预期byte或byte[]输出.有没有办法从mscorlib的原生图像中获取类型?
出于某种原因,我加载psscor4后无法运行任何命令.我从MS网站下载了x64的psscor4,并把它放在windbg所在的同一文件夹中.在加载psscor4之前,我可以毫无问题地运行sos命令.
0:003> .loadby sos clr
0:003> lmvm clr
start end module name
00007ffa`35630000 00007ffa`35fc8000 clr (deferred)
Image path: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Image name: clr.dll
Timestamp: Wed Nov 27 19:25:30 2013 (52968D7A)
CheckSum: 00996ED8
ImageSize: 00998000
File version: 4.0.30319.34011
Product version: 4.0.30319.34011
File flags: 8 (Mask 3F) Private
File OS: 4 Unknown Win32
File type: 2.0 Dll
File date: 00000000.00000000
Translations: 0409.04b0
CompanyName: Microsoft Corporation
ProductName: Microsoft® .NET Framework
InternalName: clr.dll
OriginalFilename: clr.dll
ProductVersion: 4.0.30319.34011
FileVersion: 4.0.30319.34011 built by: FX45W81RTMGDR
PrivateBuild: DDBLD109
FileDescription: …Run Code Online (Sandbox Code Playgroud) 有很多手动方法可以让WinDBG在没有符号存储的情况下找到mscordacwks.dll(将文件放在某处的路径中,将其放在与windbg.exe相同的文件夹中,将其放在我的Framework\v文件夹中,指定路径WinDBG使用.cordll -lp c:\dacFolder等),但他们都只为我修复它.对于使用我的符号存储的每个人,我需要更普遍地修复它.
我能想到的可能的解决方案是:
问:这些事情中的任何一个都是可能的,或者是否有其他方式我没有考虑解决问题?
在分析.NET进程时,我遇到了(显然很常见的)问题,即psscor2(和sosex)在我的机器上找不到合适的mscordacwks.dll.WinDBG中的错误是:
Failed to load data access DLL, 0x80004005
Verify that 1) you have a recent build of the debugger (6.2.14 or newer)
2) the file mscordacwks.dll that matches your version of mscorwks.dll is
in the version directory
3) or, if you are debugging a dump file, verify that the file
mscordacwks_<arch>_<arch>_<version>.dll is on your symbol path.
4) you are debugging on the same architecture …Run Code Online (Sandbox Code Playgroud) 我试图确定是什么导致我的应用程序高内存使用率。所以我拿了进程转储文件。EEHeap命令显示.NET内存堆中大约有2.8 GB。
0:000> !EEHeap -gc
Number of GC Heaps: 2
------------------------------
Heap 0 (00000000001e3030)
generation 0 starts at 0x00000000a5f21360
generation 1 starts at 0x00000000a5c45a60
generation 2 starts at 0x000000007fff1000
ephemeral segment allocation context: none
segment begin allocated size
000000007fff0000 000000007fff1000 00000000beeca248 0x3eed9248(1055756872)
Large object heap starts at 0x000000027fff1000
segment begin allocated size
000000027fff0000 000000027fff1000 000000028f7d42f8 0xf7e32f8(259928824)
Heap Size: Size: 0x4e6bc540 (1315685696) bytes.
------------------------------
Heap 1 (00000000001ed9e0)
generation 0 starts at 0x00000001a6c77908
generation 1 starts at 0x00000001a69a8370
generation 2 starts at …Run Code Online (Sandbox Code Playgroud) 我的问题是:
0:000> !DumpHeap -type Microsoft.Internal.ReadLock -stat
------------------------------
Heap 0
total 0 objects
------------------------------
Heap 1
total 0 objects
------------------------------
Heap 2
total 0 objects
------------------------------
Heap 3
total 0 objects
------------------------------
total 0 objects
Statistics:
MT Count TotalSize Class Name
000007fef3d14088 74247 2375904 Microsoft.Internal.ReadLock
Total 74247 objects
Run Code Online (Sandbox Code Playgroud)
我读取此输出的方式是Microsoft.Internal.ReadLock我的堆上有74,247个实例.但是,其中一些可能正在等待收集.
我想只显示那些没有待处理的集合.
例如,0000000080f88e90是其中一个对象的地址,它是垃圾.我知道,因为:
0:000> !mroot 0000000080f88e90
No root paths were found.
0:000> !refs 0000000080f88e90 -target
Objects referencing 0000000080f88e90 (Microsoft.Internal.ReadLock):
NONE
0:000> !do 0000000080f88e90
Name: Microsoft.Internal.ReadLock
MethodTable: 000007fef3d14088
EEClass: 000007fef3c63410 …Run Code Online (Sandbox Code Playgroud) 我在托管堆中存在数百个MyClass实例。其中一些位于大对象堆中。下面是各种堆结构的样子
0:000> !EEHeap -gc
Number of GC Heaps: 1
generation 0 starts at 0x0000000002df9de8
generation 1 starts at 0x0000000002dc6710
generation 2 starts at 0x0000000002a01000
ephemeral segment allocation context: none
segment begin allocated size
0000000002a00000 0000000002a01000 0000000002e3c2c0 0x43b2c0(4436672)
Large object heap starts at 0x0000000012a01000
segment begin allocated size
0000000012a00000 0000000012a01000 000000001a5ed558 0x7bec558(129942872)
000000002a980000 000000002a981000 00000000328110b8 0x7e900b8(132710584)
0000000033e00000 0000000033e01000 000000003bd80d78 0x7f7fd78(133692792)
000000001daf0000 000000001daf1000 0000000025996188 0x7ea5188(132796808)
00000000542b0000 00000000542b1000 000000005a4bf100 0x620e100(102818048)
000000005c2b0000 000000005c2b1000 000000006344df88 0x719cf88(119132040)
000000007fff0000 000000007fff1000 00000000878bfbc0 0x78cebc0(126675904)
Total Size: Size: …Run Code Online (Sandbox Code Playgroud) 我有一个73线程的用户模式转储.其中一些是管理的,其中一些是原生的.我想找到托管线程,哪个调用栈包含一定的托管函数.
我在调试器中加载了SOSEX扩展.
现在我~*e !mk要转储所有托管线程,然后手动浏览它们,寻找我需要的东西 - 太长而且无聊.
有没有更好的办法?