Использование автономного профилировщика MS в VS2008 Professional - PullRequest
2 голосов
/ 21 апреля 2010

Я пытаюсь профилировать мою DLL-библиотеку .NET при ее запуске из средств модульного тестирования VS, но у меня возникают проблемы. Я использую автономный профилировщик командной строки, поскольку VS2008 Professional не поставляется со встроенным профилировщиком.

У меня есть открытое окно CMD и я выполнил следующие команды (я проинструктировал его ранее, поэтому vsinstr выдал предупреждение, что он сделал):

C:\...\BusinessRules\obj\Debug>vsperfclrenv /samplegclife /tracegclife /globalsamplegclife /globaltracegclife
Enabling VSPerf Sampling Attach Profiling. Allows to 'attaching' to managed applications.

Current Profiling Environment variables are:
COR_ENABLE_PROFILING=1
COR_PROFILER={0a56a683-003a-41a1-a0ac-0f94c4913c48}
COR_LINE_PROFILING=1
COR_GC_PROFILING=2

C:\...\BusinessRules\obj\Debug>vsinstr BusinessRules.dll
Microsoft (R) VSInstr Post-Link Instrumentation 9.0.30729 x86
Copyright (C) Microsoft Corp. All rights reserved.

Error VSP1018 : VSInstr does not support processing binaries that are already instrumented.

C:\...\BusinessRules\obj\Debug>vsperfcmd /start:trace /output:foo.vsp
Microsoft (R) VSPerf Command Version 9.0.30729 x86
Copyright (C) Microsoft Corp. All rights reserved.

C:\...\BusinessRules\obj\Debug>

Затем я запустил модульные тесты, в которых использовался инструментированный код. Когда юнит-тесты были завершены, я сделал ...

C:\...\BusinessRules\obj\Debug>vsperfcmd /shutdown
Microsoft (R) VSPerf Command Version 9.0.30729 x86
Copyright (C) Microsoft Corp. All rights reserved.


Waiting for process 4836 ( C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\vstesthost.exe) to shutdown...

Он явно ждал закрытия VS2008, поэтому я закрыл его ...

Shutting down the Profile Monitor
------------------------------------------------------------

C:\...\BusinessRules\obj\Debug>

Все выглядело хорошо, в каталоге был файл foo.vsp 3,2 Мб. Затем я сделал ...

C:\...\BusinessRules\obj\Debug>vsperfreport foo.vsp /summary:all

Microsoft (R) VSPerf Report Generator, Version 9.0.0.0
Copyright (C) Microsoft Corporation. All rights reserved.

VSP2340: Environment variables were not properly set during profiling run and managed symbols may not resolve.  Please use vsperfclrenv before profiling.
File opened
Successfully opened the file.
A report file, foo_Header.csv, has been generated.
A report file, foo_MarksSummary.csv, has been generated.
A report file, foo_ProcessSummary.csv, has been generated.
A report file, foo_ThreadSummary.csv, has been generated.
Analysis completed
A report file, foo_FunctionSummary.csv, has been generated.
A report file, foo_CallerCalleeSummary.csv, has been generated.
A report file, foo_CallTreeSummary.csv, has been generated.
A report file, foo_ModuleSummary.csv, has been generated.

C:\...\BusinessRules\obj\Debug>

Обратите внимание на предупреждение о переменных среды и использовании vsperfclrenv? Но я управлял этим! Может я использовал не те переключатели? Я не знаю. В любом случае, загрузка файлов CSV в Excel или использование инструмента perfconsole дает массу полезной информации с бесполезными именами символов:

*** Loading commands from: C:\temp\PerfConsole\bin\commands\timebytype.dll
***   Adding command: timebytype
*** Loading commands from: C:\temp\PerfConsole\bin\commands\partition.dll
***   Adding command: partition

Welcome to PerfConsole 1.0 (for bugs please email: joshwil@microsoft.com), for help type: ?, for a quickstart type: ??

> load foo.vsp
*** Couldn't match to either expected sampled or instrumented profile schema, defaulting to sampled
*** Couldn't match to either expected sampled or instrumented profile schema, defaulting to sampled
*** Profile loaded from 'foo.vsp' into @foo

> 
> functions @foo
>>>>> Function Name

Exclusive            Inclusive            Function Name  Module Name
-------------------- -------------------- -------------- ---------------
900,798,600,000.00 % 900,798,600,000.00 % 0x0600003F     20397910
14,968,500,000.00 %  44,691,540,000.00 %  0x06000040     14736385
8,101,253,000.00 %   14,836,330,000.00 %  0x06000041     5491345
3,216,315,000.00 %   6,876,929,000.00 %   0x06000042     3924533
<snip>
71,449,430.00 %      71,449,430.00 %      0x0A000074     42572
52,914,200.00 %      52,914,200.00 %      0x0A000073     0
14,791.00 %          13,006,010.00 %      0x0A00007B     0
199,177.00 %         6,082,932.00 %       0x2B000001     5350072
2,420,116.00 %       2,420,116.00 %       0x0A00008A     0
836.00 %             451,888.00 %         0x0A000045     0
9,616.00 %           399,436.00 %         0x0A000039     0
18,202.00 %          298,223.00 %         0x06000046     1479900

Я так близок к тому, чтобы найти узкие места, если только он даст мне имена функций и модулей вместо шестнадцатеричных чисел!

Что я делаю не так?

--- Алистер.

Ответы [ 2 ]

2 голосов
/ 21 апреля 2010

Причина, по-видимому, заключается в том, что я не запускал исполняемый файл в том же процессе, в котором были определены переменные среды. Это инструментальный код, которому нужен доступ к переменным среды, а не профилировщик.

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

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

--- Алистер.

0 голосов
/ 21 апреля 2010

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

  1. Документы для vsperfclrenv говорят:

    Выбор, который вы выбираете, зависит от того, какой из трех типов профилирования вы используете: отбор проб, инструментарий или глобальный.

    У вас есть опции для всех 3 типов профилирования в вашем звонке на vsperfclrenv - Я предлагаю вам выбрать один тип, с которого нужно начинать, и переходить оттуда, если это работает, но вы хотите попробовать другойчтобы увидеть, работают ли они лучше.

  2. Возможно, вам также потребуется указать местоположение для символов (даже если это не сделано с помощью vsperfclrenv).Расположение символа можно настроить, используя переменную среды _NT_SYMBOLS_PATH или параметр /SymbolPath для vsperfreport (или располагая файлы .pdb в том же месте, что и двоичные файлы).Подробнее см. «Как: указать расположение файлов символов из командной строки» .

...