Xcod中的LLDB Python脚本

2024-06-17 15:44:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚刚发现了LLDB的this便利特性,它允许我编写Python脚本,当我在LLDB中遇到断点时,这些脚本可以访问框架中的变量。不过,在Xcode(v4.5.2)中使用它时,我遇到了一些问题。首先,我找不到任何地方说明我应该将这些Python脚本保存在哪里,以便从LLDB的命令行导入它们。其次,在LLDB中输入script之后,键盘输入有点错误:backspace不会删除屏幕上的字符,而是有效地将其从命令中删除。所以输入primt<bsp><bsp><bsp>int有效地意味着print,但它在终端上仍然是primtint。这只是审美,但它是相当烦人!

有人能给我指一些特定于Xcode的资源,让我在LLDB中使用Python吗?

EDIT:Here是另一个有趣的链接,它说您可以使用Python为变量创建自定义摘要,但是我找不到与此相关的任何内容。


Tags: 命令行脚本框架屏幕地方错误script特性
1条回答
网友
1楼 · 发布于 2024-06-17 15:44:24

不幸的是,在Xcode、lldb和Python解释器之间,交互控制台存在一些问题。请在http://bugreport.apple.com/处提交错误报告-我不知道是否已经有关于这个特定问题的错误报告,尽管这里的问题通常是已知的。如果您正在探索交互式python脚本接口,那么可能需要使用命令行lldb工具;这样会更好地工作。

我把lldb的所有python脚本都放在~/lldb中。在我的~/.lldbinit文件中,我将它们作为源代码。例如,我有~/lldb/stopifcaller.py,它是

import lldb

# Use this like
# (lldb) command script import ~/lldb/stopifcaller.py
# (lldb) br s -n bar
# (lldb) br comm add --script-type python -o "stopifcaller.stop_if_caller(frame, 'foo')" 1

def stop_if_caller(current_frame, function_of_interest):
  thread = current_frame.GetThread()
  if thread.GetNumFrames() > 1:
    if thread.GetFrameAtIndex(1).GetFunctionName() != function_of_interest:
      thread.GetProcess().Continue()

我会把command script import放在我的~/.lldbinit文件中自动加载它,如果这是我想要的。这个特定的示例将python命令添加到breakpoint#1——当lldb在断点处停止时,它将查看调用函数。如果调用函数不是foo,它将自动恢复执行。实际上,断点1只有在foo()调用bar()时才会停止。请注意,Xcode 4.5lldb在执行command script import ~/...时可能有问题——您可能需要键入主目录的完整路径(/Users/benwad/或其他内容)。我记不清了,Xcode 4.5中有几个tilde扩展问题已经修复了一段时间。

您可以直接将简单类型摘要添加到~/.lldbinit。例如,如果我调试lldb本身,ConstString对象通常只有一个感兴趣的字段,m_string ivar。所以我有

type summary add -w lldb lldb_private::ConstString -s "${var.m_string}"

或者如果是类型addr_t,我总是希望它格式化为十六进制,所以

type format add -f x lldb::addr_t

如果您想向lldb添加一个新命令,您将拥有一个python文件,如~/lldb/sayhello.py

import lldb

def say_hello(debugger, command, result, dict):
  print 'hello'

def __lldb_init_module (debugger, dict):
  debugger.HandleCommand('command script add -f sayhello.say_hello hello')

你可以像

(lldb) comma script import  ~/lldb/sayhello.py
(lldb) hello
hello
(lldb)

在大多数情况下,当您添加一个用python编写的命令时,您将使用shlexoptparse库,以便该命令可以执行选项解析,并且您将添加一个__doc__字符串-我省略了这些内容以保持示例简单。

相关问题 更多 >