Как Mono позволяет файлам ETL захватывать как собственные, так и управляемые стеки вызовов?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как Mono позволяет файлам ETL захватывать как собственные, так и управляемые стеки вызовов?

Сообщение Anonymous »

Я провожу исследовательский проект и столкнулся с проблемой в более старой версии Mono (модифицированная версия, использовавшаяся в Unity примерно в 2015–2016 годах, точная версия неизвестна). При использовании инструмента профилирования для создания файлов ETL стеки управляемых вызовов не были видны. Однако после обновления примерно в 2017 году стеки управляемых вызовов стали видны. Как это было достигнуто?
Похоже, что инструмент профилирования собирает всю необходимую информацию исключительно из файла ETL и профилируемого исполняемого файла.
Я считаю, что информация стека вызовов в ETL файлы в основном поступают из события StackWalk MSNT_SystemTrace (другие события предоставляют такие сведения, как имена функций, но они не имеют решающего значения для моего запроса).
Я попытался получить PID процесса, связанного с этим поставщиком, с помощью API Windows, но результат был -1, чего я не понимаю.
Я подозреваю, что в новых версиях Mono или его зависимостях могли быть изменения, которые могли повлиять на запись этого события, но после этого я не обнаружил никаких различий. обширный поиск.
Я не уверен, что другие провайдеры и события играют роль в визуализации стеков вызовов, но мой предварительный обзор предполагает, что они, скорее всего, нет.
Дополнительный контекст: я нашел в .NET В журналах обновлений Framework указано, что в версии 4.0 появилась некоторая поддержка тестирования производительности, но я не уверен, влияют ли конкретные изменения на явление, которое я наблюдал, или они вообще влияют на Mono. Вот ссылка: https://learn.microsoft.com/en-us/previ ... dfrom=MSDN
Вот тестовый код, который я использовал (v2.0.50215 для старой версии, v4.0.30319 для новой версии):

Код: Выделить всё

int main(int argc, char** argv)
{
Mono mono;
char hello[] = "helloworld.exe";
char* path[1] = { hello };
MonoAssembly* assembly;
MonoDomain* domain;
getchar();

puts(argv[0]);
mono_api_init(&mono,".\\mono-2.0-bdwgc.dll");
//mono_api_init(&mono, ".\\mono-2.0.dll");
mono.set_assemblies_path(".\\lib");
//domain = mono.jit_init_version("myapp", "v4.0.30319");
domain = mono.jit_init_version("myapp", "v2.0.50215");
if (!domain)
{
puts("err1");
return -1;
}

getchar();
assembly = mono.domain_assembly_open(domain, "helloworld.exe");
puts("3");
getchar();

if (!assembly)
{
puts("err2");
return -1;
}
mono.jit_exec(domain, assembly, 1, path);
}
Вот несколько скриншотов из моих тестов:
старая версия
новая версия
Одно из событий StackWalk(новая версия ):

Код: Выделить всё



0
2
0
0
32
0x0







5915705958622
0x8BDC
    19588
0x77E31CF3
0x77E31CB4
0x77E31D75
0x7FFEFEE4EA8D
0x7FFEFEE4E18D
0x7FFF0112E57B
0x7FFF0111A86E
0x7FFF010C4383
0x7FFF010C42AE
0x7687122C
0x7A6FED10
0x7A64E138
0x7A64DBF3
0x7A6EF37E
0x7A6FBD77
0x7A6DCDFD
0x24A3480
0x3BC0447
0x7A6E52E7
0x77C53773
0x77C44596
0x77C43F07
0x7A6D9192
0x77C53773
0x77C44596
0x77C42E55
0x77C429A0
0x7A6FE642
0x3D9EA8A
0x3D9E7E6
0x3958E36
0x58AB93F
0xA97BE275000000000BC1EA77000000008FC0EA7700000000


Stack
MSNT_SystemTrace
StackWalk


{def2fe46-7bd6-4b80-bd94-f57fe20d0ce3}


Может ли кто-нибудь рассказать о том, как Mono был обновлен для поддержки видимости стеков управляемых вызовов в файлах ETL, или указать мне на какие-либо соответствующие изменения или документацию?


Подробнее здесь: https://stackoverflow.com/questions/790 ... all-stacks
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»