Very Sleepy не видит имена функций при захвате скомпилированного файла MinGW
Я новичок в этом, так что, вероятно, что-то упущено Я компилирую свою программу на C с опцией gcc 4.8 (MinGW) и -g.
Затем я запускаю его и фиксирую с помощью Very Sleepy. Это все работает, но вывод Sleepy выглядит так:
memcpy 0.98 0.98 7.65 7.65 msvcrt unknown 0
[00000000004038FE] 0.77 0.77 6.02 6.02 a 0
memset 0.63 0.63 4.92 4.93 msvcrt unknown 0
[0000000000404549] 0.42 0.42 3.29 3.29 a 0
[000000000040282A] 0.35 0.35 2.73 2.73 a 0
[0000000000404600] 0.25 0.25 1.99 1.99 a 0
....
etc.
(мое приложение называется a.exe)
Так что Sleepy не видит имена функций, как мне нужно скомпилировать / запустить, чтобы это работало? Сонный сайт дает:
Поддержка GCC/ MINGW. Теперь вы можете профилировать исполняемые файлы со встроенными данными DWARF2, и это должно работать. Никаких специальных опций для этого не требуется, просто скомпилируйте "-g", чтобы убедиться, что у вас есть символы. Вы также можете использовать "-fno-omit-frame-pointer" для обеспечения правильных стеков вызовов, хотя Sleepy обычно работает в любом случае. Вам не нужно использовать "-pg" или любой мусор. Он может даже правильно распределить стеки между Microsoft DLL в GCC, что оказалось сложнее, чем вы думаете.
Но этого не достаточно в моем случае.
1 ответ
Обычно мы вызываем очень сонную команду (или любой другой инструмент отладки) с аргументами:
-O0
: устанавливает оптимизацию кода по умолчанию (более оптимизированный код, используемый для сокращения времени или пространства, может скрывать некоторые функции)-g
: он используется для сохранения имени функций и переменной, которые по умолчанию обрабатываются для оптимизации исполняемого файла, но делает его менее отлаживаемым: gcc -g: что произойдет-fno-omit-frame-pointer
: он также используется для улучшения отладки, пропуская указатели фреймов (функция, используемая для повышения производительности, но которая делает отладку менее читаемой), в зависимости от того, когда я должен опустить указатель фреймов?, С этой опцией, выходной код сборки более прост. Это помогает отладчику-gdwarf-2
: https://gcc.gnu.org/onlinedocs/gcc-3.4.5/gcc/Debugging-Options.html указывает, что он настроен для принудительного вывода выходного формата отладки на "dwarf2". Фактически, опция -g просто говорит компилятору "сохранять некоторую информацию". gdwarf будет указывать формат вывода (если это возможно).
Вы также можете добавить -glevel
указать точность выходной информации. Значение по умолчанию - 2. Он не сохраняет макросы и некоторые определения. Может быть, вы можете установить его на 3.
Если этого недостаточно, может быть, вы можете дать минимальный рабочий образец, чтобы увидеть точную проблему (какая функция должна появиться в журнале)?
Надеюсь, это поможет