Windbg родной вызов стека стопки не имеет смысла

StackOverflow https://stackoverflow.com/questions/3902682

  •  29-09-2019
  •  | 
  •  

Вопрос

У меня простая программа тестирования, вызывающая бесконечное ожидание на блокировке.

public class SyncBlock
{

}

class Program
{
    public static SyncBlock sync = new SyncBlock();

    private static void ThreadProc()
    {
        try
        {
            Monitor.Enter(sync);


       }
        catch (Exception)
        {
            //Monitor.Exit(sync);
            Console.WriteLine("3rd party code threw an exception");
        }
    }
    static void Main(string[] args)
    {
        Thread newThread = new Thread(ThreadProc);
        newThread.Start();


        Console.WriteLine("Acquiring lock");
        Monitor.Enter(sync);

        Console.WriteLine("Releasing lock");
        Monitor.Exit(sync);

    }
}

Таким образом, основной нить в основном заблокирован, когда она пытается сделать монитор .enter (синхронизация). Если я посмотрел на! ClrStack на главной ните, его вывод в принципе показать его, что имеет смысл, но когда я пытаюсь увидеть родную сторону стека, я ожидаю увидеть некоторое ожидание на одном / множественном вызове объекта, но я не вижу Это. Может кто-нибудь объяснить это. Спасибо

0:000> !CLRStack  

Символ PDB для mscorwks.dll не загружен
ID поток ОС: 0x1e8 (0)
Esp Eip.
0012F0A8 77455E74 [GCFrame: 0012f0a8
0012F178 77455E74 [HELPERMETHODFRAME_1OBJ: 0012F178] System.Threading.Monitor.enter (System.Object) 0012F1D0 00A40177 Конкресопливание1.program.main (System.String [])
0012F400 70FC1B4C [GCRAME: 0012F400
0: 000> КБ
Childebp RetAddr args к ребенку
ПРЕДУПРЕЖДЕНИЕ: Стекская информация раскручивается не доступная. Следующие кадры могут быть неправы.
0012eeb4 710afb92 0012ee68 002d6280 00000000 ntdll! Kifastsystemcallret
0012ef1c 710af7c3 00000001 002d6280 00000000 mscorwks! SystemnameFreeBuffer + 0x1b1f2
0012ef3c 710af8cc 00000001 002d6280 00000000 mscorwks! SystemnameFreeBuffer + 0x1ae23
0012EFC0 710AF961 00000001 002D6280 00000000 Mscorwks! ShippynameFreeBuffer + 0x1AF2C
0012F010 710afae1 00000001 002d6280 00000000 mscorwks! ShippynameFreeBuffer + 0x1AFC1
0012f06c 70fdc5ae fffffffff 00000001 00000000 mscorwks! ShippynameFreeBuffer + 0x1b141
0012f080 710df68a fffffffff 00000001 00000000 mscorwks! Logheelp_noguionassert + 0x10562
0012F10C 710B1154 002AAD90 FFFFFFFF 002AAD90 MSCORWKS! ShippyNameFreeBuffer + 0x4acea
0012f128 710b10d8 42b8b47d 00000000 002Aad90 mscorwks! SystemnameFreeBuffer + 0x1c7b4
0012f1e0 70fc1b4c 0012f1f0 0012f230 0012f270 mscorwks! SystemnameFreeBuffer + 0x1C738
0012f1f0 70fd2219 0012f2c0 00000000 0012f290 mscorwks + 0x1b4c
0012f270 70fe6591 0012f2c0 00000000 0012f290 mscorwks! Logheelp_noguionassert + 0x61cd
0012f3ac 70fe65c4 0023c038 0012f478 0012f444 mscorwks! Touginitizeee + 0x2ead
0012F3C8 70FE65E2 0023C038 0012F478 0012F444 Mscorwks! Covinitizeee + 0x2ee00
0012f3e0 7103389d 0012f444 42b8b0f1 00000000 mscorwks! Chinitializeee + 0x2efe
0012F544 710337BD 002332E0 00000001 0012F580 Mscorwks! GetPrivateContextsperfcounters + 0xF546
0012f7ac 71033d0d 00000000 42b8b9c9 00000001 mscorwks! GetprivateContextsperfcounters + 0xf466
0012FC7C 71033EF7 00CE000000000000 42B8979 MSCORWKS! GetPrivateContextsperfcounters + 0xF9B6
0012FCCC 71033E27 00CE0000 42B8B8A1 00000000 MSCorwks! Corexemain + 0x168
* Ошибка: файл символов не найден. По умолчанию для экспорта символов для C: Windows Microsoft.net framework v4.0.30319 mscoreei.dll - 0012fd14 71cf55ab 71033d8f 0012fd30 71f37f16 mscorwks! Corexemain + 0x98
*
Ошибка: файл символа не найден. По умолчанию для экспорта символов для C: Windows System32 mscoree.dll -
0012FD20 71F37F16 00000000 71CF0000 0012FD44 MShoreei! Corexemain + 0x38
0012fd30 71f34de3 00000000 7723d0e9 7ffd8000 mscoree! CreateConfigStream + 0x13f
0012FD44 774319BB 7FFD8000 084952F9 00000000 Mscoree! Corexemain + 0x8
0012FD84 7743198E 71F34DDB 7FFD8000 00000000 NTDLL! RtlinitializeexceptionChain + 0x63
0012FD9C 00000000 71F34DDB 7FFD8000 00000000 NTDLL! RtlinitializexceptionChain + 0x36

Это было полезно?

Решение

Вы должны указывать Windbg на сервер символов Microsoft Windows, чтобы получить хороший след стека.

Введите следующее в вашем окне команды windbg:

.sympath srv * c: Websymbols * http: //msdl.microsoft.com/download/symbols

Также видим это:

Использование сервера символов Microsoft для получения символов

Кроме того, чтобы ответить на ваш оригинальный вопрос о том, как отладить это, вот поваренная книга:

0: 000>! CLRSTACK OS Тема ID: 0x1358 (0) ESP EIP 0012F328 7C90E514 [GCFrame: 0012F328] 0012F3F8 7C90E514 [HELPERMETHODRAME_1OBJ: 0012F3F8] System.Threading.monitor.enter (System.Object) 0012F450 00d10177 Program.main (система. String []) 0012F688 79E71B4C [GCFRAME: 0012F688

В вашей оригинальной программе фоновая нить была начата первым. Итак, он приобрел замок. Однако он вышла без освобождения замка. После этого ваша главная тема пыталась приобрести замок, и он застрял, потому что замок уже принадлежит.

Как вы узнаете, кто владеет этим? Сначала сделайте! Темы, а затем! Syncblk.

0: 000>! Тематические потоки ThreadCount: 3 ScostArtedThread: 0 Фон. MTA 2 2 1360 0015E320 B220 Включено 00000000: 00000000 001540D0 0 mta (финализатор) xxxx 3 0 00175A98 9820 Включено 00000000: 00000000 001540D0 1 UKN 0: 000>! Синхронизация индекса синхронизатор мониторинга Рекурсионное средство Владение нитью Информация о синхронике владелец 2 0017903C 3 1 00175A98 0 xxx 013503CC Синхроблок --------------------------------- Всего 2 CCW 0 RCW 0 comclassfactory 0 бесплатно 0

Как видите,! SyncBlk говорит, что объект Owining нить 00175A98.. Отказ Из вывода потоков! Вы можете увидеть, что объект потока 00175A98 - это мертвая резьба, которая вышла при владении блокировки.

Надеюсь это поможет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top