Отладчик уровня CIL для кода C# в Linux с моно
У меня есть следующий код C#, который я скомпилировал в Linux с помощью mono, и я хочу пошагово выполнить его команды CIL. В частности, я хочу иметь возможность исследовать стек и видеть значения, извлеченные и извлеченные из него.
using System;
namespace ARITH
{
class MUL
{
static void Main()
{
int i = 742;
int j = 999;
if (i*j == 15242)
{
Console.WriteLine("MMMM");
}
}
}
}
Как я могу пошагово сгенерировать CIL-код внутри main? Вот сгенерированный 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...