Я работаю над созданием 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++)?
🤔 А знаете ли вы, что...
Язык C++ активно развивается, и новые стандарты регулярно добавляют новые возможности.
Вы можете заставить CDB отображать исходные строки для STL (Стандартная библиотека Microsoft C++), загрузив копию репозитория STL и установив путь к исходному коду CDB:
Убедитесь, что Git установлен:
winget install Git.Git
Перезапустите командную строку, чтобы убедиться, что Git установлен на вашем Path
.
Клонируйте репозиторий STL:
git clone https://github.com/microsoft/STL
(Необязательно) Убедитесь, что репозиторий Git и ваш код используют одну и ту же версию STL:
Перейдите в репозиторий STL:
CD STL
Определите соответствующий тег Git. Я использую Visual Studio 2022 версии 17.10.2, поэтому мне подходит тег vs-2022-17.10
. Вы можете найти список тегов Git для репозитория STL здесь.
Переключитесь на тег:
git switch --detach <tag>
Запускаем КДБ:
<path-to-cdb> -lines -c "l+t; l+s; .srcfix; .srcpath+ <path-to-STL-repo>" -o <path-to-debugee>
Примечание. Не используйте <path-to-STL-repo>
, даже если он содержит пробелы.