我有在Linux上使用mono编译的以下C#代码, 我想单步执行其CIL命令。特别, 我希望能够检查堆栈, 并查看推入和弹出的值。
using System;
namespace ARITH
{
class MUL
{
static void Main()
{
int i = 742;
int j = 999;
if (i*j == 15242)
{
Console.WriteLine("MMMM");
}
}
}
}
如何在main内部单步生成的CIL代码? 这是主要函数的生成的CIL:
$ mcs main.cs
$ monodis main.exe > main.cil
$ sed -n '37,60p;61q' main.cil
.method private static hidebysig
default void Main () cil managed
{
// Method begins at RVA 0x2058
.entrypoint
// Code size 36 (0x24)
.maxstack 2
.locals init (
int32 V_0,
int32 V_1)
IL_0000: ldc.i4 742
IL_0005: stloc.0
IL_0006: ldc.i4 999
IL_000b: stloc.1
IL_000c: ldloc.0
IL_000d: ldloc.1
IL_000e: mul
IL_000f: ldc.i4 15242
IL_0014: bne.un IL_0023
IL_0019: ldstr "MMMM"
IL_001e: call void class [mscorlib]System.Console::WriteLine(string)
IL_0023: ret
} // end of method MUL::Main
编辑:
在sudo apt install sdb
之后,我准备了一个简单的脚本来确保
我正确使用了命令,实际上以下脚本为局部变量i
和j
打印了正确的值:
$ cat sdbCommands.txt
bp add func ARITH.MUL.Main
r main.exe
step
step
step
step
print i
print j
$ sdb -f sdbCommands.txt
但是,我仍然找不到gdb的stepi
。也就是说,进入CIL级别...