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.

Если этого недостаточно, вы можете дать минимальный рабочий образец, чтобы увидеть точную проблему (какая функция должна появиться в журнале)?

Я надеюсь, что это поможет