Как эта трассировка стека возможна в .Net? - PullRequest
1 голос
/ 21 августа 2011

Моя проблема в том, что какой-то код вызывается реентерабельным способом, что приводит к его аварийному завершению и попытке отладки того, как он может быть вызван 2-мя потоками или реентерабельным с одним и тем же потоком.Я добавил журнал, который выдает Environment.StackTrace, и вот что он получил в конце этого сообщения.

Моя путаница заключается в следующей строке:

at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()

Это похоже на верхили начало любого стека.Но обратите внимание, что трассировка стека фактически начинается перед этими строками.На самом деле, строка, предшествующая приведенным выше, выглядит так:

at TickZoom.MBTFIX.MBTFIXSimulator.OnTick(Message quoteMessage, SymbolInfo symbol, Tick tick) in C:\Local\TickZoom\Project\Public\Providers\MBTFIX\MBTFIXProvider\MBTFIX\MBTFIXSimulator.cs:line 481

Вот строка 481:

if( trace) log.Trace("Sending tick: " + tick);

Но эта строка - просто сообщение журнала и не может каким-либо возможным способомвызовите System.Threading.ThreadHelper.ThreadStart ().Так как же существует эта безумная трассировка стека?

at TickZoom.MBTFIX.MBTFIXSimulator.OnTick(Message quoteMessage, SymbolInfo symbol, Tick tick) in C:\Local\TickZoom\Project\Public\Providers\MBTFIX\MBTFIXProvider\MBTFIX\MBTFIXSimulator.cs:line 479
at TickZoom.FIX.FIXServerSymbolHandler.ProcessOnTickCallBack() in C:\Local\TickZoom\Project\Public\Providers\Common\ProviderUtil\FIX\FIXServerSymbolHandler.cs:line 301
at TickZoom.Threading.TaskLoop.Run() in C:\Local\TickZoom\Project\Engine\Parallel\TaskBase.cs:line 669
at TickZoom.Threading.TaskBase.Execute(ThreadInfo thread) in C:\Local\TickZoom\Project\Engine\Parallel\TaskBase.cs:line 213
at TickZoom.Threading.ParallelManager.ExecuteTasks(ThreadInfo thread) in C:\Local\TickZoom\Project\Engine\Parallel\ParallelManager.cs:line 685
at TickZoom.Threading.ParallelManager.Run() in C:\Local\TickZoom\Project\Engine\Parallel\ParallelManager.cs:line 632
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
at TickZoom.MBTFIX.MBTFIXSimulator.OnTick(Message quoteMessage, SymbolInfo symbol, Tick tick) in C:\Local\TickZoom\Project\Public\Providers\MBTFIX\MBTFIXProvider\MBTFIX\MBTFIXSimulator.cs:line 481
at TickZoom.FIX.FIXServerSymbolHandler.ProcessOnTickCallBack() in C:\Local\TickZoom\Project\Public\Providers\Common\ProviderUtil\FIX\FIXServerSymbolHandler.cs:line 301
at TickZoom.Threading.TaskLoop.Run() in C:\Local\TickZoom\Project\Engine\Parallel\TaskBase.cs:line 669
at TickZoom.Threading.TaskBase.Execute(ThreadInfo thread) in C:\Local\TickZoom\Project\Engine\Parallel\TaskBase.cs:line 213

1 Ответ

2 голосов
/ 01 декабря 2011

Как и в комментариях к вашему вопросу, странные трассировки стека, такие как эта, возникают, когда одна или несколько трасс стека выводятся сразу друг за другом:

Log.WriteLine(Environment.StackTrace)
try
{
    SomethingThatThrowsAnException();
}
catch (Exception e)
{
    Log.WriteLine(e.StackTrace); // better to do Log.WriteLine(e) to get the message
}
...