Мне это кажется ошибкой в реализации DTrace для Mac / iOS.
Однако, поскольку вы уже проверяете каждую запись и возврат функции, вы можете просто сохранить новую переменную self->depth
ивыполните ++
в датчике :::entry
и --
в датчике :::return
.Это не работает вполне правильно, если вы запускаете его для оптимизированного кода, потому что любые функции, оптимизированные для хвостового вызова, могут выглядеть так, как будто они входят, но никогда не возвращаются.Чтобы решить эту проблему, вы можете отключить оптимизацию.
Кроме того, поскольку то, что вы делаете, выглядит примерно так, я подумал, что, возможно, вас заинтересует параметр -F
:
Объединить вывод трассировки путем определения входа и возврата функции.Отчеты о проверке входа в функцию имеют отступ, и их выводу предшествует ->
.Отчеты о проверке возврата функции не имеют отступов, и к их выводу добавляется префикс <-
.
Обычный сценарий для использования с -F
выглядит примерно так:
pid$target::some_function:entry { self->trace = 1 }
pid$target:::entry /self->trace/ {}
pid$target:::return /self->trace/ {}
pid$target::some_function:return { self->trace = 0 }
Где some_function
- это функция, выполнение которой вы хотите распечатать.Вывод показывает текстовый график вызовов для этого выполнения:
-> some_function
-> another_function
-> malloc
<- malloc
<- another_function
-> yet_another_function
-> strcmp
<- strcmp
-> malloc
<- malloc
<- yet_another_function
<- some_function