Как я нахожу владельца дескриптора от подвешивать дампа с помощью windbg?

Для начала вам нужно что-то вроде:

SELECT TOP 5
    ID, 
    [Case ID], 
    [Owner], 
    Rnd(-Timer()*[ID]) AS RandomRecord
FROM 
    [Cases]
ORDER BY 
    Rnd(-Timer()*[ID]);

для использования в качестве подзапроса, отфильтрованного по OwnerID таблицы ваших владельцев.

Однажды я опубликовал статью на эту тему с более подробной информацией:

Случайные строки в Microsoft Access

8
задан Oskar 23 January 2009 в 13:15
поделиться

3 ответа

Рассмотрение стека вызовов, кажется, что рассматриваемый стек использует ReaderWriterLock, блокирующий механизм.

1130e410 00f24557 mscorwks!CRWLock::StaticAcquireWriterLockPublic+0xc9

Изменитесь на поток 9 и использование выполненный sos.dll! dso для разгрузки управляемого объекта ReaderWriterLock. Затем выполненный! сделайте на этом объект ReaderWriterLock. Я полагаю, что существует поле потока владения, которое можно запросить. Я буду тестировать его и видеть.

Старый школьный способ определить это состоит в том, чтобы выполнить ~ *e! clrstack и исследуют все управляемые потоки, которые ожидают на readerwriter, блокируют и затем видят, можно ли найти поток, который ввел ту же функцию, но прошел через блокировку (т.е. другое смещение)

Спасибо, Aaron

Примечание: Не уверенный, если существует способ связать сообщения, но этот очень похож на
Как я нахожу lockholder (читатель) моего ReaderWriterLock в windbg

2
ответ дан 6 December 2019 в 00:59
поделиться

Можно вырыть это из дампа ядра.

Теперь, насколько ядро, отлаживающее, идет, livekd от sysinternals должно быть достаточным, но к сожалению это только применимо в рабочей системе.

Существует также инструмент приобретения памяти привилегированного режима, который мог бы быть полезным для взятия дампа с (в земельном участке windbg) для более позднего контроля.

Иначе, включая трассировку дескриптора (! htrace - включают) и (если код, уникальный для особого потока), владение дескриптора могло бы быть заключено из отслеживания стека.

0
ответ дан 6 December 2019 в 00:59
поделиться

Используйте команду ! htrace , чтобы получить идентификатор потока. Вы должны сначала, возможно, в начале программы, включить сбор трассировки с помощью ! Htrace -enable .

0:001> !htrace 00003aec
--------------------------------------
Handle = 0x00003aec - OPEN
Thread ID = 0x00000b48, Process ID = 0x000011e8

...

Приведенный выше результат является вымышленным, он будет другим для вашей системы. Но он предоставит вам необходимую информацию - идентификатор потока (0x00000b48 в моем примере). необходимо перезапустить исходный процесс на компьютере пользователя, поэтому не может отлаживать живую сессию.

Я не уверен на 100%, но думаю, что это сработает:

  1. Подключитесь к процессу и запустите ! htrace -enable
  2. Отключитесь от процесса с помощью qd . Исполняемый файл будет продолжен.
  3. Теперь вы можете взять файл дампа и использовать указанную выше команду - я думаю, вы получите описанные результаты.
1
ответ дан 6 December 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: