Мне интересно, можно ли выбрать выбранные элементы из команды bt
. Например. найти вызывающие функции для определенной функции. Идея состоит в том, чтобы добавить постоянную точку останова в рассматриваемой функции и затем распечатать столбец, например. вызывающая функция, возможно, вызывающая функция этого. В конце концов это, вероятно, сводится к фильтрации результата команды bt
. Фильтрация должна была бы исключать между собой рамки и методы выполнения.lldb: как получить вызывающие функции?
2
A
ответ
5
Вам нужно заглянуть в скрипт на Python, чтобы сделать это сегодня - это неплохо.
(lldb) br se -n mach_msg
(lldb) br comm add -s python 1
Enter your Python command(s). Type 'DONE' to end.
> thread = frame.GetThread()
> frnum = 0
> for fr in thread.frames:
> print '% 2d %s' % (frnum, fr.GetFunctionName())
> frnum = frnum + 1
> frame.GetThread().GetProcess().Continue()
> DONE
Я поставил свою точку останова (на mach_msg
() в данном примере), я добавляю команду моей точки останова (-s python
означает, что он написан на языке сценариев Python, я добавляю эту команду останова # 1).
Код python поставляется с текущим объектом контрольной точки и объектом кадра автоматически (см. «help break command add
» на lldb). Я получаю текущий поток из объекта фрейма, а затем перебираю кадры стека для этого потока.
В lldb есть много встроенной информации о том, какие операции вы можете выполнять на этих объектах python. например
(lldb) script help (lldb.SBFrame)
(lldb) script help (lldb.SBThread)
Смотрите также http://lldb.llvm.org/python-reference.html
Ха, друг указал, что я пропустил «команду» тип сценария, который можно поставить на точки останова. Вы можете сделать это без Python с помощью команды «br comm add -s 1», за которой следуют любые команды lldb, которые вы хотите («bt», «c»), а затем «DONE». –
У меня есть следующее сообщение: «Предупреждение: никакая команда не привязана к точке останова». – Adobels