2012-06-08 3 views
2

Мне интересно, можно ли выбрать выбранные элементы из команды bt. Например. найти вызывающие функции для определенной функции. Идея состоит в том, чтобы добавить постоянную точку останова в рассматриваемой функции и затем распечатать столбец, например. вызывающая функция, возможно, вызывающая функция этого. В конце концов это, вероятно, сводится к фильтрации результата команды bt. Фильтрация должна была бы исключать между собой рамки и методы выполнения.lldb: как получить вызывающие функции?

ответ

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

+0

Ха, друг указал, что я пропустил «команду» тип сценария, который можно поставить на точки останова. Вы можете сделать это без Python с помощью команды «br comm add -s 1», за которой следуют любые команды lldb, которые вы хотите («bt», «c»), а затем «DONE». –

+0

У меня есть следующее сообщение: «Предупреждение: никакая команда не привязана к точке останова». – Adobels