Получить имя метода, с которого начался этот стек - PullRequest
3 голосов
/ 14 декабря 2011

Я получаю следующий результат при запуске! Dumpstack через командную строку windbg.

000000000a136510 000007fed86f404c (MethodDesc 000007fed85d7e60 +0x14c System.Data.SqlClient.SqlParameter.GetActualSize()), calling System_Data_ni+0x10f010
000000000a136530 000007fed86f483d (MethodDesc 000007fed85d7f18 +0x4d System.Data.SqlClient.SqlParameter.GetCoercedValue()), calling System_Data_ni+0x10efc0
000000000a136570 000007fed86f4ac8 (MethodDesc 000007fed85d7fc0 +0x58 System.Data.SqlClient.SqlParameter.ValidateTypeLengths(Boolean))
000000000a136650 000007fed870322d (MethodDesc 000007fed861d7a0 +0x1d Bid.Trace(System.String, Int32)), calling clr+0x2da0
000000000a1366a0 000007fed86f2a98 (MethodDesc 000007fed85c2240 +0x6a8 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(System.Data.CommandBehavior, System.Data.SqlClient.RunBehavior, Boolean, Boolean)), calling (MethodDesc 000007fed85dabe0 +0 System.Data.SqlClient.TdsParser.TdsExecuteRPC(System.Data.SqlClient._SqlRPC[], Int32, Boolean, System.Data.Sql.SqlNotificationRequest, System.Data.SqlClient.TdsParserStateObject, Boolean))
000000000a1366e0 000007fee2babf7d (MethodDesc 000007fee28bedf8 +0x7d System.WeakReference.set_Target(System.Object)), calling 000007fee4123f00 (stub for System.GC.KeepAlive(System.Object))
000000000a136770 000007fed86f23ca (MethodDesc 000007fed85c2230 +0x21a System.Data.SqlClient.SqlCommand.RunExecuteReader(System.Data.CommandBehavior, System.Data.SqlClient.RunBehavior, Boolean, System.String, System.Data.Common.DbAsyncResult)), calling System_Data_ni+0x10ee58
000000000a1367a0 000007fed86fad47 (MethodDesc 000007fed85d9cb0 +0x797 System.Data.ProviderBase.DbConnectionPool.GetConnection(System.Data.Common.DbConnection)), calling (MethodDesc 000007fed85d9348 +0 System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(System.Transactions.Transaction))
000000000a1367e0 000007fee2bdc66b (MethodDesc 000007fee299df68 +0x1b System.Security.CodeAccessSecurityEngine.Check(System.Security.CodeAccessPermission, System.Threading.StackCrawlMark ByRef)), calling clr+0x2da0
000000000a136820 000007fed86f219c (MethodDesc 000007fed85c2220 +0x1c System.Data.SqlClient.SqlCommand.RunExecuteReader(System.Data.CommandBehavior, System.Data.SqlClient.RunBehavior, Boolean, System.String)), calling System_Data_ni+0x10ef48
000000000a136830 000007fed86f1431 (MethodDesc 000007fed85c1d10 +0x21 System.Data.SqlClient.SqlCommand.get_Statistics()), calling System_Data_ni+0x10e8f8
000000000a136860 000007fed86f1fa0 (MethodDesc 000007fed85c20f8 +0x100 System.Data.SqlClient.SqlCommand.ExecuteReader(System.Data.CommandBehavior, System.String)), calling System_Data_ni+0x10eec8
000000000a136890 000007fed86f9f99 (MethodDesc 000007fed85d9b90 +0x59 System.Data.ProviderBase.DbConnectionFactory.GetConnection(System.Data.Common.DbConnection)), calling (MethodDesc 000007fed85d9cb0 +0 System.Data.ProviderBase.DbConnectionPool.GetConnection(System.Data.Common.DbConnection))
000000000a136910 000007fed86f1e74 (MethodDesc 000007fed85c20b8 +0xe4 System.Data.SqlClient.SqlCommand.ExecuteReader(System.Data.CommandBehavior)), calling System_Data_ni+0x10ee68
000000000a136930 000007fed86f0b5d (MethodDesc 000007fed85d72e8 +0x23d System.Data.SqlClient.SqlConnection.Open()), calling (MethodDesc 000007fed861d3c0 +0 Bid.ScopeLeave(IntPtr ByRef))
000000000a136950 000007fed86f50b2 (MethodDesc 000007fed85d8e28 +0x92 System.Data.SqlClient.SqlParameterCollection.Add(System.Object))
000000000a1369c0 000007ff00c075d1 000007ff00c075d1, calling System_Data_ni+0x10ef30

Моя проблема в том, что я не могу получить имя метода, с которого начался этот стек. Можете ли вы сказать мне команду, чтобы отслеживать его?

Это первые несколько строк результатов:

    0:045>  !dumpstack
OS Thread Id: 0x2ecc (45)
TEB information is not available so a stack size of 0xFFFF is assumed
Current frame: clr!LogHelp_LogAssert+0x14e54
Child-SP         RetAddr          Caller, Callee
000000000a136100 000007fee4167ca9 clr!PreBindAssemblyEx+0x14c9d, calling clr+0x12e0
000000000a136130 000007fee446962e clr!CreateAssemblyConfigCookie+0x554de, calling clr+0x21a0
000000000a136140 000007fee40d2b44 clr!LogHelp_LogAssert+0x1efe4, calling clr!LogHelp_LogAssert+0xf80
000000000a136210 000007fed8716d76 (MethodDesc 000007fed85d67a0 +0x36 DomainNeutralILStubClass.IL_STUB_PInvoke(SNI_Conn*, SNI_Packet_IOType, SNI_Packet*, ConsumerNum)), calling 000007fee40c89a0 (stub for System.StubHelpers.StubHelpers.BeginStandalone(IntPtr, IntPtr, Int32))
000000000a1362b0 000007fee4167b5c clr!PreBindAssemblyEx+0x14b50, calling clr!LogHelp_LogAssert+0xf10

Ответы [ 3 ]

1 голос
/ 30 декабря 2011

Команда! Dumpstack принимает параметр [top of stack [bottom of stack]], поэтому вы можете вручную задать ему некоторые значения. Он останавливается на 000000000a1369c0, поэтому вы можете попробовать указать его в качестве вершины стека и посмотреть, сможет ли он найти больше информации. Если нет, вы можете попробовать вручную восстановить стек, используя что-то вроде 'dqs 000000000a1369c0', но это будет соответствовать только собственным символам. Я никогда не делал ручную реконструкцию стека для clrstack.

1 голос
/ 20 апреля 2012

Когда открывается Windbg, существует два типа сеансов отладки

  1. Анализ дампа
  2. Живая отладка.

Хитрость в поиске правильной нити заключается в том, чтобы открыть Threads and Processes window и выбрать правильную нить. Обратите внимание, что другие потоки в том же процессе будут показывать только свою часть цикла. Обычно в сеансах прямой отладки вам нужен верхний поток, тогда вы увидите весь стек.

1 голос
/ 14 декабря 2011

Вы пробовали "! CLRStack -p"?

Кроме того, DumpMethodSig получит полную сигнатуру метода.

Вот все команды, которые вы можете использовать: http://msdn.microsoft.com/en-us/library/bb190764.aspx

...