1、程序调试时,我们经常要根据条件来设置断点,降低条件断点命中率,方便调试操作。有时候程序出现异常数据时,

我们要根据属性访问时来设置断点,排查是谁写入或者读取了这些属性。

2、写了一个简单的demo程序。随机生成一个人的姓名和年龄,希望年龄为20岁时,程序中断。



1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Text.RegularExpressions;
6 using System.Threading.Tasks;
7 using System.Threading;
8
9 namespace WindbgDemo
10 {
11 public class Program
12 {
13
14 static void Main(string[] args)
15 {
16 Person person = null;
17
18 while (true)
19 {
20 int age = GenerateRandomNumber(5, 40);
21 string firstName = string.Empty;
22 string lastName = string.Empty;
23 GenerateRandomName(out firstName,out lastName);
24 person = new Person(firstName, lastName, age);
25 if (age < 10)
26 person.FullName = "Jerry Mill";
27 System.Threading.Thread.Sleep(500);
28
29 }
30
31 Console.ReadKey();
32 }
33
34
35 static int GenerateRandomNumber(int min, int max)
36 {
37 var seed = Convert.ToInt32(Regex.Match(Guid.NewGuid().ToString(), @"\d+").Value);
38 return new Random(seed).Next(min, max);
39 }
40
41 static void GenerateRandomName(out string firstName,out string lastName)
42 {
43 string[] lastNames = new string[] { "Baker", "Hunter", "Carter", "Smith", "Cook", "Miller", "Turner", "Hall", "Mill", "Churchill", "Field", "Wood", "Well", "Hard", "Bird", "Stock", "Cotton", "Bush", "Reed", "White" };
44 string[] firstNames = new string[] { "Aaron", "August", "Blake", "Bill", "Cheney", "Dick", "Derek", "Ethan", "Elijah", "Gino", "Jerry", "Kenny", "Kevin", "Lorin", "Leonard", "Mike", "Norman", "Riley", "Terence", "William" };
45 int first = GenerateRandomNumber(0, 19);
46 int last = GenerateRandomNumber(0, 19);
47 firstName = firstNames[first];
48 lastName = lastNames[last];
49 }
50 }
51
52
53 public class Person
54 {
55
56 private string fullName = string.Empty;
57
58 public string FullName {
59 get { return this.fullName; }
60 set {
61 if (value != this.fullName)
62 {
63 this.fullName = value;
64 Console.WriteLine("My name is " + FirstName + " " + LastName + ",now i got a new name" + value+"...");
65 }
66 }
67 }
68 public int Age { get; set; }
69 public string LastName { get; set; }
70 public string FirstName { get; set; }
71 public Person(string first,string last,int age)
72 {
73 this.FirstName = first;
74 this.LastName = last;
75 this.fullName = first + " " + last;
76 this.Age = age;
77 Console.WriteLine("My name is " + first + " " + last + "," + age.ToString() + " years old...");
78 }
79 }
80
81 }


3、用Windbg加载编译后的exe程序。在main方法中设置断点。



Opened log file 'D:\Projects\06BreakPoint\logs\log01.txt'
0:000> .load C:\Windows\Microsoft.NET\Framework\v4.0.30319\sos.dll
0:000> .load C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
0:000> sxe ld clrjit
0:000> g
(fa8.274): Unknown exception - code 04242420 (first chance)
ModLoad: 6b130000 6b1b0000 C:\Windows\Microsoft.NET\Framework\v4.0.30319\clrjit.dll
eax=00000000 ebx=00000000 ecx=00000000 edx=00000000 esi=7ffdf000 edi=0022e570
eip=773e70b4 esp=0022e488 ebp=0022e4dc iopl=0 nv up ei pl zr na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246
ntdll!KiFastSystemCallRet:
773e70b4 c3 ret
0:000> !bpmd WindbgDemo.exe WindbgDemo.Program.Main
Found 1 methods in module 00324014...
MethodDesc = 00324d24
Adding pending breakpoints...
sxe -c "!HandleCLRN" clrn
0:000> g
(fa8.274): CLR notification exception - code e0444143 (first chance)
JITTED WindbgDemo!WindbgDemo.Program.Main(System.String[])
Setting breakpoint: bp 0037047E [WindbgDemo.Program.Main(System.String[])]
bp 0037047E
g
Breakpoint 0 hit
eax=00000000 ebx=0022f05c ecx=016b228c edx=00000000 esi=00000000 edi=0022efd0
eip=0037047e esp=0022ef98 ebp=0022efb8 iopl=0 nv up ei pl zr na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246
0037047e 90 nop
0:000> !clrstack -a
OS Thread Id: 0x274 (0)
Child SP IP Call Site
0022ef98 0037047e *** WARNING: Unable to verify checksum for WindbgDemo.exe
WindbgDemo.Program.Main(System.String[]) [d:\Projects\WindbgDemo\WindbgDemo\06BreakPoint.cs @ 15]
PARAMETERS:
args (0x0022efb4) = 0x016b228c
LOCALS:
0x0022ef9c = 0x00000000
0x0022efb0 = 0x00000000
0x0022efac = 0x00000000
0x0022efa8 = 0x00000000
0x0022efa4 = 0x00000000

0022f130 67ceeaf6 [GCFrame: 0022f130]
0:000> !ip2md 0037047e
MethodDesc: 00324d24
Method Name: WindbgDemo.Program.Main(System.String[])
Class: 00321348
MethodTable: 00324d50
mdToken: 06000001
Module: 00324014
IsJitted: yes
CodeAddr: 00370448
Transparency: Critical
Source file: d:\Projects\WindbgDemo\WindbgDemo\06BreakPoint.cs @ 15
0:000> !u 00324d24
Normal JIT generated code
WindbgDemo.Program.Main(System.String[])
Begin 00370448, size e4

...

d:\Projects\WindbgDemo\WindbgDemo\06BreakPoint.cs @ 20:
0037048b b905000000 mov ecx,5
00370490 ba28000000 mov edx,28h
00370495 ff15384d3200 call dword ptr ds:[324D38h] (WindbgDemo.Program.GenerateRandomNumber(Int32, Int32), mdToken: 06000002)
0037049b 8945e8 mov dword ptr [ebp-18h],eax
0037049e 8b45e8 mov eax,dword ptr [ebp-18h]
003704a1 8945f8 mov dword ptr [ebp-8],eax

d:\Projects\WindbgDemo\WindbgDemo\06BreakPoint.cs @ 21:
003704a4 8b0500236b02 mov eax,dword ptr ds:[26B2300h] ("")
003704aa 8945f4 mov dword ptr [ebp-0Ch],eax
...

d:\Projects\WindbgDemo\WindbgDemo\06BreakPoint.cs @ 29:
00370518 90 nop

d:\Projects\WindbgDemo\WindbgDemo\06BreakPoint.cs @ 18:
00370519 b801000000 mov eax,1
0037051e 25ff000000 and eax,0FFh
00370523 8945ec mov dword ptr [ebp-14h],eax

d:\Projects\WindbgDemo\WindbgDemo\06BreakPoint.cs @ 15:
00370526 90 nop
00370527 e95effffff jmp 0037048a
0:000> bp 0037048b "j(poi(0x0022efb0 ) >= 0n20) '.echo greater than 20;?poi(0x0022efb0 )';'g;'"
0:000> g
greater than 20
Evaluate expression: 30 = 0000001e
eax=00000001 ebx=0022f05c ecx=00000001 edx=0000009b esi=00000000 edi=0022efd0
eip=0037048b esp=0022ef98 ebp=0022efb8 iopl=0 nv up ei pl nz na po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000202
0037048b b905000000 mov ecx,5

0:000> g
greater than 20
Evaluate expression: 35 = 00000023
eax=00000001 ebx=0022f05c ecx=00000001 edx=0000009b esi=00000000 edi=0022efd0
eip=0037048b esp=0022ef98 ebp=0022efb8 iopl=0 nv up ei pl nz na po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000202
0037048b b905000000 mov ecx,5
0:000>
greater than 20
Evaluate expression: 35 = 00000023