royt
Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Необходимо на BCB 6.0 программно (не в отладчике) получить call stack - список вызовов процедур. Есть ли для этого какие-то готовые исходники (библиотеки)? Есть самописный набор функций (основанный на _http://win32.mvps.org/misc/stackwalk.html и других исходниках), делающий всё что надо с помощью Debug Help API (dbghelp.dll) - но при условии, что с exe-шником поставляется файл .dbg (в соответствующем формате). Далее, есть тулза map2dbg (от Lucian Wischik, _http://www.wischik.com/lu/programmer/), которая позволяет сформировать этот .dbg-файл по .map-файлу, генерируемому BCB - но только для Borland C++Builder 5. Но BCB6 стал генерировать .map-файлы, которые чем-то отличаются от .map-файлов BCB5, и map2dbg с ними работает некорректно (т.е. какой-то .dbg файл выдается, но call stack по нему не определяется). Попалось вот такое сообщение "Stackwalk, map2dbg, BCB6 - solved" (от 2003-09-03), но концов не нашел. Есть некая "Borland Debug Hook Library", это два файла: bordebug.dll, bordebug.h Но она тоже для BCB5, для BCB6 не попадалось. Да и описание к ней довольно скудное, примеров нету - в свое время не смог заставить работать даже с BCB5. Знаю еще про JCL (Jedi, JVCL), но ихний debug handler выводит call stack с именами процедур (функций) без номеров строк (место вызова в исходнике). В описании сказано, что для runtime packages номеров исходников ждать не стоит в принципе (т.к. Borland не предоставляет информацию о номерах строк даже в отладочных версиях билиотек: "Borland does not provide detailed MAP files for them so you get procedure or method name only"), но про номера строк компилируемого приложения ничего не говорится - т.е., вроде как, можно ждать вывода номеров строк. Цитата: "To get line number information for Borland RTL and VCL/CLX units you have to check Use Debug DCUs checkbox...". Тем не менее, у меня номера строк не выводятся, а выглядит стек вызовов примерно так: Код: Exception EAccessViolation occured in @TForm1@StartButtonClick$qqrp14System@TObject at 0 in file Message: Access violation at address 0044C3CE in module 'SomeApplication.exe'. Read of address 00000170 Call stack: [0044C3CE] Form1.OBJ.@TForm1@StartButtonClick$qqrp14System@TObject [00620F3F] RTL.LIB|System.@System@@HandleAnyException$qqrv [0060414A] RTL.LIB|Math.@Math@Ceil$qqrxg [006574C2] VCL.LIB|Graphics.@Graphics@TCanvas@GetHandle$qqrv [006CA85A] VCL.LIB|Buttons.@Buttons@_16428 ... [0066E12E] VCL.LIB|Forms.@Forms@TApplication@Run$qqrv [00401F2B] SomeApplication.OBJ.WinMain [0061F81D] RTL.LIB|System.@System@@GetMem$qqri ... [006CD314] VCLE.LIB|dstring.@System@AnsiString@$bdtr$qqrv [00401BA7] SomeApplication.OBJ.@C4_2 | Может все-таки JCL можно заставить выводить номера строк, удавалось ли кому то это сделать? Кроме того, jcl формирует на основе .map-файла отладочную информацию в каком-то своем формате (JDBG). Может хотя бы есть способ заставить формировать его "обычный" .dbg ... Есть еще EurekaLog (для Delphi/BCB). С ним идут исходники (вроде бы все, хотя точно не знаю), но они все на паскале и довольно объемные. Проблем со знанием паскаля нету, просто очень желательно иметь готовые исходники именно на C или C++ (не буду слишком вдаваться в подробности, почему так). В общем вариант - только переписывать на C++, на что надо приличное время... p.s. (безотносительно к решению основного вопроса): Кто знает, какие отличия появились в структуре .map-файла между BCB 5.0 и 6.0? Хочется все-таки заставить map2dbg корректно работать с .map-файлами от BCB6. | Всего записей: 319 | Зарегистр. 18-08-2004 | Отправлено: 11:50 31-03-2006 | Исправлено: royt, 12:05 31-03-2006 |
|