callgrind не профилирует функции C, вызываемые языками интерпретатора - PullRequest
0 голосов
/ 18 мая 2018

Моя основная программа написана на C. Код C вызывает язык интерпретатора, скажем, python, через свои API-интерфейсы C.Затем язык интерпретатора перезванивает к другим API C.Весь код C является отлаживаемым, интерфейс C языка интерпретатора также отлаживаем.

Я обнаружил, что callgrind не может профилировать код C, вызываемый языком интерпретатора.Его дерево вызовов останавливается на коде C, который вызывает язык интерпретатора.

Это какое-то известное ограничение callgrind?Oracle Solaris Studio работает на корпусе.

1 Ответ

0 голосов
/ 19 мая 2018

логика callgrind поддерживает стек постепенно.Это означает, что он должен понимать соглашение о вызовах всего, что находится в стеке, обнаруживать вызовы и возвраты.

Вы можете сравнить с размотчиком valgrind и разматывателем gdb, используя gdb + vgdb.

Запустите valgrind с помощью: valgrind --vgdb-error = 0 --vgdb = full ....

Установите точку останова в коде C, вызываемом языком интерпретатора, и продолжите выполнение.

Когда встречается точка останова, сравните результат двух следующих команд gdb:

  • backtrace
  • monitor v.info scheduler

выше будет показано, работают ли разматыватели gdb и / или valgrind.

Вы можете попытаться понять, что делает callgrind, используя некоторые параметры отладки valgrind, например,

valgrind --tool = callgrind -v-v -v -d -d -d --ct-verbose = 3

(отрегулируйте nr -v / -d / verbosity на свой вкус).

И, конечно же,если у вас старая версия valgrind, вы можете попробовать последнюю версиюили даже git-репозиторий, даже если я сомневаюсь, что что-то недавно изменилось в этой области.

...