Наше 32-битное приложение C ++ называет свои потоки, используя стандартный подход на Windows. Мы генерируем мини-дампы при возникновении ошибок, но когда дампы загружаются в Visual Studio 2013, имена потоков отсутствуют. Это усложняет отладку проблемы, учитывая большое количество присутствующих потоков.
Единственный способ улучшить ситуацию, о которой я слышал, — это Публикация голоса пользователя Microsoft, где вызывающая сторона предлагает встроить их в пользовательский поток и написать собственное расширение Visual Studio для переименования потоков при загрузке дампа. Однако это кажется громоздким и, очевидно, добавляет много времени к процессу загрузки.
Есть ли более простой способ встраивать имена потоков в дамп, чтобы они «просто работали» при загрузке их в Visual Studio?
Для справки: мы используем Visual Studio 2013 для сборки, наши приложения работают на Win7 или выше, и мы используем Google Breakpad для создания дампов.
Microsoft указала, что API SetThreadDescription будет основой для любой надлежащей поддержки, которую они добавят в будущем для имен потоков в дампах, отладчиках и / или инструментах анализа.
К сожалению, похоже, что этот API довольно новый и еще не поддерживается в дампах, WinDbg, Visual Studio Debugger и т. Д. Пользовательский голосовой запрос, чтобы добавить эту поддержку, поэтому, пожалуйста, проголосуйте за него, если вы хотите правильно присвоить потокам постоянное имя.
После еще нескольких копаний кажется, что один из способов сделать это — сохранить указатель на имя в поле ArbitraryUserPointer TEB потока.
Если затем TEB был встроен в мини-дамп (что может быть достигнуто с помощью флага MiniDumpWithProcessThreadData, в соответствии с Эта статья) тогда кажется, что по крайней мере мы могли бы просмотреть текущее имя потока в окне просмотра Visual Studio, оценивая
(*(char **)(@TIB+0x14))
Возможно, надстройка отладчика Visual Studio может быть написана для проверки содержимого TEB при подключении к процессу и использования исключения «hack» для установки имени потока в окне «Потоки».