WinDbg получает адреса всех функций из символов - PullRequest
2 голосов
/ 17 февраля 2020

Выполнение команды x ShittyProject!* Я получаю такой вывод

<MSIL:00250014         > ShittyProject!Main (void)
<MSIL:00250098         > ShittyProject!.ctor (void)
<MSIL:00250037         > ShittyProject!.ctor (void)
<MSIL:002500ed         > ShittyProject!get_Default (void)
<MSIL:002500a1         > ShittyProject!get_ResourceManager (void)
<MSIL:002500f8         > ShittyProject!.cctor (void)
<MSIL:0025002a         > ShittyProject!Foo (void)
<MSIL:0025006e         > ShittyProject!InitializeComponent (void)
<MSIL:00250000         > ShittyProject!InitializeComponent (void)
<MSIL:002500da         > ShittyProject!get_Culture (void)
<MSIL:002500e5         > ShittyProject!set_Culture (void)

Если я правильно понял MSIL:*, это только адрес функции в файле pdb? Можно ли как-то получить адреса функции для размещения точек останова на них?

1 Ответ

3 голосов
/ 18 февраля 2020

Управляемый код отличается от собственного кода. Чтобы установить точки останова «собственным способом» (bp), вам нужно подождать, пока метод не будет JIT-скомпилирован, а затем использовать собственный адрес метода.

Как правило, этого не делать, но используйте вместо этого NET конкретный c эквивалентов. Существует SOS (документы Microsoft) !bpmd или SOSEX (вероятно, больше не поддерживается) !mbm.

С учетом кода

using System;

namespace JittyProject
{
    class Program
    {
        static void Main()
        {
            Console.WriteLine("You want to stop before this shows up.");
            Console.ReadLine();
        }
    }
}

Вы хотите остановиться на начальной точке останова и сказать ей подождать до тех пор, пока не будет загружена NET, например,

0:000> sxe ld clr
0:000> g

После загрузки среды выполнения. NET вы можете загрузить расширение SOS для . NET Speci c Команды отладки.

0:000> .loadby sos clr

И расширение SOSEX:

0:000> .load c:\wherever\SOSEX.dll

А затем добавить точку останова:

0:000> !mbm JittyProject.Program.Main

Использование обычный g, вы в конечном итоге достигнете точки останова:

0:000> g
ModLoad: 76650000 766e2000   C:\Windows\SysWOW64\OLEAUT32.dll
Breakpoint: JIT notification received for method JittyProject.Program.Main() in AppDomain 00960db0.
Breakpoint set at JittyProject.Program.Main() in AppDomain 00960db0.
Breakpoint 2 hit

0:000> !clrstack
OS Thread Id: 0x3ff8 (0)
Child SP       IP Call Site
003eeda0 77601ffc [PrestubMethodFrame: 003eeda0] JittyProject.Program.Main() [C:\...\JittyProject\Program.cs @ 8]
003eef74 77601ffc [GCFrame: 003eef74] 
...