2009-11-25 2 views
5

Я использую VS 2010 и работаю с большим количеством потоков в C# в моем текущем проекте. Я написал несколько утилит дампа потока для записи определенных типов потоков для целей отладки, но я, кажется, постоянно спотыкаюсь о временах, когда я отлаживаю, и мне нужно заглянуть в поток, от которого я отлаживаюсь, но я не ставил свои дамп звонит туда. Похоже, что я мог бы сбрасывать поток как-то просто с помощью VS или, может быть, сказать ему, чтобы вызвать один из моих методов дампа в потоке в отладчике. Нужно ли это делать?Есть ли способ сбросить поток из отладчика в VS

В потоках, с которыми я работаю, есть текст, описывающий капли данных, а затем байты блоба, поэтому поиск описания полезен. Мои методы дампа обычно просто выгружают эту информацию, а затем пропускают капли.

ответ

4

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

+0

Очень приятно, это отличное решение, которое позволяет мне сделать мои функции свалки быть частью отладчика – MikeD

1

Вы можете просто использовать открывшееся окно для вызова функции дампа при отладке:

MikeDsDumpFxn(whateverStreamIsActiveInThisContext) 

Если функция возвращает строку, он будет печатать прямо в результате в непосредственной окно.

9

Тип этого в окне Immediate:

System.Diagnostics.Debug.WriteLine((new System.IO.StreamReader(stream)).ReadToEnd()); 
+1

Возможно, вам понадобится 'System.Diagnostics.Debug.WriteLine ((новый System.IO.StreamReader (поток)). ReadToEnd());' – KCD

+2

Обратите внимание, что это вызовет вызов, чтобы вы знали, что вы, вероятно, не будете в состоянии продолжить текущий сеанс отладки. –

0

Если у вас есть двоичные данные в потоке можно попробовать сбрасывать его в файл, используя следующие строки в immediate window:

var lastPos = stream.Position; 
stream.Seek(0, SeekOrigin.Begin) 
File.WriteAllBytes("filepath.bin", new BinaryReader(stream).ReadBytes((int)stream.Length)) 
stream.Seek(lastPos, SeekOrigin.Begin) 

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

Если поток не имеет Length свойства можно использовать аналогичное решение to the one done here:

var lastPos = stream.Position;  
var ms = new MemoryStream(); 
stream.Seek(0, SeekOrigin.Begin) 
stream.CopyTo(ms) 
File.WriteAllBytes("filepath.bin", ms.ToArray()) 
stream.Seek(lastPos, SeekOrigin.Begin) 
Смежные вопросы