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.

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

Надеюсь, это поможет

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