Как заставить CDB показывать исходные строки стандартной библиотеки Microsoft C++?

Я работаю над созданием Descent 3 . В запросе на включение, над которым я сейчас работаю, есть ошибка, доступная только для Windows. Я хотел бы использовать отладчик, чтобы помочь мне отследить ошибку.

В частности, функция abort() вызывается, когда вы пытаетесь открыть меню многопользовательской игры. Мне удалось использовать CDB, чтобы получить обратную трассировку сбоя:

0:000:x86> kp
ChildEBP RetAddr
0075e080 71b11701     ucrtbased!issue_debug_notification(wchar_t * message = 0x71a7384c "abort() has been called")+0x30 [minkernel\crts\ucrt\src\appcrt\internal\report_runtime_error.cpp @ 28]
0075e098 71b23eba     ucrtbased!__acrt_report_runtime_error(wchar_t * message = 0x71a7384c "abort() has been called")+0x11 [minkernel\crts\ucrt\src\appcrt\internal\report_runtime_error.cpp @ 154]
0075e0a8 00da135d     ucrtbased!abort(void)+0x1a [minkernel\crts\ucrt\src\appcrt\startup\abort.cpp @ 51]
0075e0b0 00b89e89     Descent3!__std_fs_directory_iterator_close(__std_fs_dir_handle _Handle = 0n34772936 (No matching enumerant))+0x1d [D:\a\_work\1\s\src\vctools\crt\github\stl\src\filesystem.cpp @ 255]
0075e0c0 00b89e49     Descent3!std::filesystem::_Find_file_handle::~_Find_file_handle(void)+0x19 [C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.40.33807\include\filesystem @ 611]
0075e0cc 00b8a3e6     Descent3!std::filesystem::_Dir_enum_impl::~_Dir_enum_impl(void)+0x19
0075e0d8 00b87d5d     Descent3!std::filesystem::_Dir_enum_impl::`scalar deleting destructor'(void)+0x16
0075e0e4 00b8a96a     Descent3!std::_Destroy_in_place<std::filesystem::_Dir_enum_impl>(struct std::filesystem::_Dir_enum_impl * _Obj = 0x136a6110)+0xd [C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.40.33807\include\xmemory @ 293]
0075e0f4 00b8a83d     Descent3!std::_Ref_count_obj2<std::filesystem::_Dir_enum_impl>::_Destroy(void)+0x1a [C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.40.33807\include\memory @ 2101]
0075e104 00b8a7f2     Descent3!std::_Ref_count_base::_Decref(void)+0x2d [C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.40.33807\include\memory @ 1163]
0075e110 00b89da6     Descent3!std::_Ptr_base<std::filesystem::_Dir_enum_impl>::_Decref(void)+0x22 [C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.40.33807\include\memory @ 1380]
0075e11c 00b89f16     Descent3!std::shared_ptr<std::filesystem::_Dir_enum_impl>::~shared_ptr<std::filesystem::_Dir_enum_impl>(void)+0x16 [C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.40.33807\include\memory @ 1671]
0075e128 00b7ed01     Descent3!std::filesystem::directory_iterator::~directory_iterator(void)+0x16 [C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.40.33807\include\filesystem @ 2700]
0075eab8 00b20216     Descent3!MainMultiplayerMenu(void)+0x7c1 [D:\VC\Partially mine\Descent3\repo\Descent3\multi_ui.cpp @ 457]
0075f578 00a7d8e6     Descent3!MainMenu(void)+0x626 [D:\VC\Partially mine\Descent3\repo\Descent3\menu.cpp @ 876]
0075f598 00a7d754     Descent3!MainLoop(void)+0x86 [D:\VC\Partially mine\Descent3\repo\Descent3\descent.cpp @ 543]
0075f654 00c82f13     Descent3!Descent3(void)+0x214 [D:\VC\Partially mine\Descent3\repo\Descent3\descent.cpp @ 507]
0075f660 00c825d1     Descent3!oeD3Win32App::run(void)+0x13 [D:\VC\Partially mine\Descent3\repo\Descent3\winmain.cpp @ 145]
0075f7cc 00c81a7b     Descent3!HandledWinMain(struct HINSTANCE__ * hInst = 0x009e0000, struct HINSTANCE__ * hPrevInst = 0x00000000, char * szCmdLine = 0x0203136e "-WINDOWED -NOINTRO -PILOT JAYMAN2000", int nCmdShow = 0n10)+0x271 [D:\VC\Partially mine\Descent3\repo\Descent3\winmain.cpp @ 525]
0075f818 00dbaf7d     Descent3!WinMain(struct HINSTANCE__ * hInst = 0x009e0000, struct HINSTANCE__ * hPrevInst = 0x00000000, char * szCmdLine = 0x0203136e "-WINDOWED -NOINTRO -PILOT JAYMAN2000", int nCmdShow = 0n10)+0x6b [D:\VC\Partially mine\Descent3\repo\Descent3\winmain.cpp @ 536]
0075f838 00dbadfa     Descent3!invoke_main(void)+0x2d [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl @ 107]
0075f894 00dbac8d     Descent3!__scrt_common_main_seh(void)+0x15a [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl @ 288]
0075f89c 00dbaff8     Descent3!__scrt_common_main(void)+0xd [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl @ 331]
0075f8a4 760d7ba9     Descent3!WinMainCRTStartup(void * __formal = 0x004e0000)+0x8 [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_winmain.cpp @ 17]
0075f8b4 779dc10b     KERNEL32!BaseThreadInitThunk+0x19
0075f90c 779dc08f     ntdll32!__RtlUserThreadStart+0x2b
0075f91c 00000000     ntdll32!_RtlUserThreadStart+0x1b
0:000:x86> 

Я хотел знать, почему __std_fs_directory_iterator_close() звонит abort(), поэтому попробовал установить точку останова на __std_fs_directory_iterator_close():

0:011> bp __std_fs_directory_iterator_close
0:011> g
[…]
Entering MainMultiplayerMenu()
Breakpoint 0 hit
Descent3!__std_fs_directory_iterator_close:
00da1340 55              push    ebp
0:000:x86> 

Я всегда использую CDB в режиме отладки исходного кода (я запускаю CDB со следующими аргументами командной строки: -lines -c "ld Descent3; l+s; l+t" -o "%cd%\Descent3.exe".), но он не показывает строки исходного кода для __std_fs_directory_iterator_close(). CDB показывает исходные строки для функций, находящихся в исходном коде Descent 3, но не показывает исходные строки для функций, находящихся в стандартной библиотеке C++.

Как мне заставить CDB показывать исходные строки для STL (стандартной библиотеки Microsoft C++)?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете заставить CDB отображать исходные строки для STL (Стандартная библиотека Microsoft C++), загрузив копию репозитория STL и установив путь к исходному коду CDB:

  1. Убедитесь, что Git установлен:

    winget install Git.Git
    
  2. Перезапустите командную строку, чтобы убедиться, что Git установлен на вашем Path.

  3. Клонируйте репозиторий STL:

    git clone https://github.com/microsoft/STL
    
  4. (Необязательно) Убедитесь, что репозиторий Git и ваш код используют одну и ту же версию STL:

    1. Перейдите в репозиторий STL:

      CD STL
      
    2. Определите соответствующий тег Git. Я использую Visual Studio 2022 версии 17.10.2, поэтому мне подходит тег vs-2022-17.10. Вы можете найти список тегов Git для репозитория STL здесь.

    3. Переключитесь на тег:

      git switch --detach <tag>
      
  5. Запускаем КДБ:

    <path-to-cdb> -lines -c "l+t; l+s; .srcfix; .srcpath+ <path-to-STL-repo>" -o <path-to-debugee>
    

    Примечание. Не используйте <path-to-STL-repo>, даже если он содержит пробелы.

Это какие-то эзотерические вещи? Неужели мы просто увидим документацию, воспроизведенную по SO, в течение следующих нескольких месяцев?

sweenish 14.06.2024 20:12

Голосование за доверие, это звучит полезно

catnip 14.06.2024 20:37

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

Ginger Jesus 14.06.2024 22:31

@sweenish CDB похож на GDB или LLDB, как это может быть эзотерическим? Интерфейс и стабильные функции не исчезнут. Он умрет, когда никто больше не будет использовать MSVC или GDB/LLDB.

phuclv 15.06.2024 03:18

@phuclv Вы упускаете суть моего вопроса. А учитывая, сколько времени прошло, я уже не особо в это вникаю.

sweenish 16.06.2024 03:14

Другие вопросы по теме