Example source (run against latest github pull):
class MainClass
{
public static void Main (string[] args)
{
var mod =
ModuleDefinition.ReadModule("/usr/lib/mono/2.0/
System.dll");
var crashOn =
mod.GetType("Microsoft.VisualBasic.VBCodeGenerator").GetMethods().First(m
=> m.Name == "OutputTypeNamePair");
ILParser.Parse(crashOn, new EmptyVisitor());
// Find other crash sites:
// foreach (var m in mod.GetAllTypes().SelectMany(t =>
t.Methods).Where(mt => mt.HasBody))
// {
// ILParser.Parse(m, new EmptyVisitor());
// }
}
public class EmptyVisitor: IILVisitor {
#region IILVisitor implementation
public void OnInlineNone (Mono.Cecil.Cil.OpCode opcode)
{}
public void OnInlineSByte (Mono.Cecil.Cil.OpCode
opcode, sbyte
value)
{ }
public void OnInlineByte (Mono.Cecil.Cil.OpCode opcode,
byte value)
{ }
public void OnInlineInt32 (Mono.Cecil.Cil.OpCode
opcode, int value)
{ }
public void OnInlineInt64 (Mono.Cecil.Cil.OpCode
opcode, long
value)
{ }
public void OnInlineSingle (Mono.Cecil.Cil.OpCode
opcode, float
value)
{ }
public void OnInlineDouble (Mono.Cecil.Cil.OpCode
opcode, double
value)
{ }
public void OnInlineString (Mono.Cecil.Cil.OpCode
opcode, string
value)
{ }
public void OnInlineBranch (Mono.Cecil.Cil.OpCode
opcode, int
offset)
{ }
public void OnInlineSwitch (Mono.Cecil.Cil.OpCode
opcode, int[]
offsets)
{ }
public void OnInlineVariable (Mono.Cecil.Cil.OpCode
opcode,
Mono.Cecil.Cil.VariableDefinition variable)
{ }
public void OnInlineArgument (Mono.Cecil.Cil.OpCode
opcode,
ParameterDefinition parameter)
{ }
public void OnInlineSignature (Mono.Cecil.Cil.OpCode
opcode,
CallSite callSite)
{ }
public void OnInlineType (Mono.Cecil.Cil.OpCode opcode,
TypeReference type)
{ }
public void OnInlineField (Mono.Cecil.Cil.OpCode opcode,
FieldReference field)
{ }
public void OnInlineMethod (Mono.Cecil.Cil.OpCode
opcode,
MethodReference method)
{ }
#endregion
}
}
Stacktrace on exception:
Mono.Cecil.Mixin.GetParameter (self=(null), index=2)
Mono.Cecil.Cil.CodeReader.GetParameter (index=2)
Mono.Cecil.Rocks.ILParser.ParseCode (code_size=54,
context={Mono.Cecil.Rocks.ILParser.ParseContext})
Mono.Cecil.Rocks.ILParser.ParseFatMethod
(context={Mono.Cecil.Rocks.ILParser.ParseContext})
Mono.Cecil.Rocks.ILParser.Parse (method={System.Void
Microsoft.VisualBasic.VBCodeGenerator::OutputTypeNamePair(System.CodeDom.CodeTypeReference,System.String)},
visitor={CrashMethodParser.MainClass.EmptyVisitor})
Am I using the visitor wrong? (In this example I do nothing, except
let them get invoked).
Cheers,
Davy
--
--
mono-cecil