xcode使用lldb的python脚本查看WebKit的WTF::String和Vector等基础类

webkit关于gdb的wiki:http://trac.webkit.org/wiki/GDB

它是自带了gdb和lldb的python脚本的,路径分别在

webkit workingcopy/Tools/gdb/webkit.py 直接看脚本内容http://trac.webkit.org/browser/trunk/Tools/gdb/webkit.py

webkit workingcopy/Tools/lldb/lldb_webkit.py 直接看脚本内容http://trac.webkit.org/browser/trunk/Tools/lldb/lldb_webkit.py

配置lldb初始化时加载python脚本:

1. 当然是checkout出lldb_webkit.py这个文件了,也可直接下载http://trac.webkit.org/export/147046/trunk/Tools/lldb/lldb_webkit.py,放在什么地方都行,现举例是放在用户目录下, 即 ~/

2. 在用户目录下新建文件,命名为“.lldbinit”,注意前面有个点符号哦。

3. .lldbinit的内容为:

command script import ~/lldb_webkit.py

4. 如果已打开,重启xcode

从脚本内容看,支持查看:

  • WTF::String
  • WTF::StringImpl
  • WTF::AtomicString
  • WTF::Vector
  • WTF::HashTable。 包括HashMap, HashSet等

xcode只有lldb支持了python,所以以下的截图都是lldb的。

这是测试代码:

Vector<String> v;
    v.append("hello");
    v.append("world");

    HashMap<String, String> map;
    map.set("h", "hello");
    map.set("w", "world");

    AtomicString as = "thanks";

这是xcode的可视化调试窗口的效果:

这是terminal的p功能:

(lldb) p v
(WTF::Vector<WTF::String, 0>) $0 = { size = 2, capacity = 16 } {
  (WTF::String) [0] = { length = 5, contents = 'hello' } {
    (WTF::RefPtr<WTF::StringImpl>) m_impl = {
      (WTF::StringImpl *) m_ptr = 0x000000010a45a7d0 { length = 5, is8bit = 1, contents = 'hello' }
    }
  }
  (WTF::String) [1] = { length = 5, contents = 'world' } {
    (WTF::RefPtr<WTF::StringImpl>) m_impl = {
      (WTF::StringImpl *) m_ptr = 0x000000010a45ad80 { length = 5, is8bit = 1, contents = 'world' }
    }
  }
  (size_t) m_size = 2
  (WTF::Vector<WTF::String, 0>::Buffer) m_buffer = {
    (WTF::VectorBufferBase<WTF::String>) WTF::VectorBufferBase<WTF::String> = {
      (WTF::String *) m_buffer = 0x000000010a45ae50 { length = 5, contents = 'hello' }
      (size_t) m_capacity = 16
    }
  }
}
(lldb) p as
(WTF::AtomicString) $1 = { length = 6, contents = 'thanks' } {
  (WTF::String) m_string = { length = 6, contents = 'thanks' } {
    (WTF::RefPtr<WTF::StringImpl>) m_impl = {
      (WTF::StringImpl *) m_ptr = 0x000000010a45b0b0 { length = 6, is8bit = 1, contents = 'thanks' }
    }
  }
}
(lldb) p map
(WTF::HashMap<WTF::String, WTF::String, WTF::StringHash, WTF::HashTraits<WTF::String>, WTF::HashTraits<WTF::String> >) $2 = {
  (WTF::HashMap<WTF::String, WTF::String, WTF::StringHash, WTF::HashTraits<WTF::String>, WTF::HashTraits<WTF::String> >::HashTableType) m_impl = { tableSize = 8, keyCount = 2 } {
    (WTF::String) [0] = { length = 0, contents = '' } {
      (WTF::RefPtr<WTF::StringImpl>) m_impl = {
        (WTF::StringImpl *) m_ptr = 0x0000000000000000 { length = 0, is8bit = 0, contents = '' }
      }
    }
    (WTF::String) [1] = { length = 0, contents = '' } {
      (WTF::RefPtr<WTF::StringImpl>) m_impl = {
        (WTF::StringImpl *) m_ptr = 0x0000000000000000 { length = 0, is8bit = 0, contents = '' }
      }
    }
    (WTF::String) [2] = { length = 0, contents = '' } {
      (WTF::RefPtr<WTF::StringImpl>) m_impl = {
        (WTF::StringImpl *) m_ptr = 0x0000000000000000 { length = 0, is8bit = 0, contents = '' }
      }
    }
    (WTF::String) [3] = { length = 0, contents = '' } {
      (WTF::RefPtr<WTF::StringImpl>) m_impl = {
        (WTF::StringImpl *) m_ptr = 0x0000000000000000 { length = 0, is8bit = 0, contents = '' }
      }
    }
    (WTF::String) [4] = { length = 1, contents = 'w' } {
      (WTF::RefPtr<WTF::StringImpl>) m_impl = {
        (WTF::StringImpl *) m_ptr = 0x000000010a45af70 { length = 1, is8bit = 1, contents = 'w' }
      }
    }
    (WTF::String) [5] = { length = 5, contents = 'world' } {
      (WTF::RefPtr<WTF::StringImpl>) m_impl = {
        (WTF::StringImpl *) m_ptr = 0x000000010a45b080 { length = 5, is8bit = 1, contents = 'world' }
      }
    }
    (WTF::String) [6] = { length = 0, contents = '' } {
      (WTF::RefPtr<WTF::StringImpl>) m_impl = {
        (WTF::StringImpl *) m_ptr = 0x0000000000000000 { length = 0, is8bit = 0, contents = '' }
      }
    }
    (WTF::String) [7] = { length = 0, contents = '' } {
      (WTF::RefPtr<WTF::StringImpl>) m_impl = {
        (WTF::StringImpl *) m_ptr = 0x0000000000000000 { length = 0, is8bit = 0, contents = '' }
      }
    }
    (ValueType *) m_table = 0x000000010a45b000
    (int) m_tableSize = 8
    (int) m_tableSizeMask = 7
    (int) m_keyCount = 2
    (int) m_deletedCount = 0
  }
}
时间: 2024-10-31 09:51:29

xcode使用lldb的python脚本查看WebKit的WTF::String和Vector等基础类的相关文章

如何使用Python脚本来监控线上AMQ Number of Pending Messages数量

需求:用python脚本统计线上AMQ的Number of Pending Messages数量,当达到10的时候发送Email报警邮件 脚本实现逻辑如下: 1)用户名密码登陆到WEB页面 2)获取WEB页面的源代码 3)用正则表达式匹配AMQ的Number of Pending Messages值 4)判断是否达到报警阀值 5)如果达到报警阀值,发送Email报警邮件 在登陆AMQ页面的时候用Fiddler工具(www.fiddler2.com)查看HTTP请求的详细过程. Fiddler工具

Linux 平台下 Python 脚本编程入门(一)

众所周知,系统管理员需要精通一门脚本语言,而且招聘机构列出的职位需求上也会这么写.大多数人会认为 Bash (或者其他的 shell 语言)用起来很方便,但一些强大的语言(比如 Python)会给你带来一些其它的好处. 在 Linux 中学习 Python 脚本编程 首先,我们会使用 Python 的命令行工具,还会接触到 Python 的面向对象特性(这篇文章的后半部分会谈到它). 学习 Python 可以助力于你在桌面应用开发及数据科学领域的职业发展. 容易上手,广泛使用,拥有海量"开箱即用

让IIS7.5 执行Python脚本的配置方法_win服务器

[详细步骤]: 1. 从Python下载windows版本的安装程序(点击进入),我这里由于操作系统是x64的因此选择Python 2.7.11 x64 Installer ~ 2. 安装,这里建议不要安装到系统盘,以免重做系统后再次安装~ 3. IIS7.5->ISAPI和CGI限制->右键添加->ISAPI或CGI路径选择Python文件夹下的python.exe %s %s:描述中填写:python. 4.IIS7.5->处理程序映射->添加脚本映射->请求路径:

《面向ArcGIS的Python脚本编程》——1.7 Python脚本实例

1.7 Python脚本实例 面向ArcGIS的Python脚本编程 本节将通过两个例子来说明如何使用Python编写脚本.这两个例子来源于Esri和ArcGIS的用户社区.列举脚本实例的原因之一就是为了让读者熟悉Python代码.学习编写代码的一个最好的方法就是练习现有的代码.现在不要求读者能够理解这些代码,但是这些例子将会让您了解本书即将讲些什么. 例一:确定错误地址 AddressError脚本工具是由Esri公司的员工Bruce Harold开发的.该工具会在几条路段的范围内,检查路段中

ps_mem:一个用于精确报告Linux核心内存用量的简单Python脚本

ps_mem 是一个可以帮助我们精确获取 Linux 中各个程序核心内存使用情况的简单 python 脚本.虽然在 Linux 上有很多可用于查看内存使用情况的工具,比如 free.vmstat.smem.top 等,但这个工具和其它的区别在于其精确显示核心内存使用情况. 它会分别计算一个程序私有内存总量和共享内存总量,并以更准确的方式给出了总的内存使用量.很明显的,它将帮助大家知道系统中哪个程序正在占用更多的内存. 你可以通过包管理器.pip .或直接运行 ps_mem.py 脚本等多种方式来

怎样使用Python脚本日志功能_python

假设要开发一个自动化脚本工具,工程结构如下,Common这个package是框架功能的实现,Scripts目录是我们编写的测试用例脚本(请忽略其他不相关的目录). 我们对日志功能的需求如下:      1 为了便于日志的查看,每个脚本对应一个日志文件,日志文件以脚本的名字命名      2 日志路径以及每个脚本保存的日志容量可以设置,比如设置为5MB,则超过后最老日志被自动覆盖      3 日志功能要使用方便,减少与框架业务功能的耦合 现在来逐一分析上述需求. 1 要实现每个脚本一个日志文件,

教你用Python脚本快速为iOS10生成图标和截屏_python

简介 这两天更新完Xcode8之后发现Xcode对图标的要求又有了变化,之前用的一个小应用"IconKit"还没赶上节奏,已经不能满足Xcode8的要求了. 于是就想起来用Python自己做个脚本来生成图标. 其实这个脚本很早就写了,现在为了适应iOS10,就修改完善下,并且放到了 GitHub . 可以看看效果图:   代码: #encoding=utf-8 #by 不灭的小灯灯 #create date 2016/5/22 #update 2016/9/21 #support iO

使用Python脚本来控制Windows Azure的简单教程_python

inux开发人员经常使用 Python 完成小块的工作,因为你可以编写脚本的情况很容易.它已经成为完成配置和部署等小任务的一个流行方式.Windows Azure,微软的云,也没有什么不同.通过 Python SDK 所提供的可用性,Python 成为 Windows Azure 的头等公民.让我们看看我们如何能够使用Python无需其它而只需一个Windows Azure订阅就可以用编程方式从 vmdepot 部署一个映像到 Windows Azure上. 建立一个管理证书 任何与 Windo

《面向ArcGIS的Python脚本编程》——1.2 Python的特点

1.2 Python的特点 面向ArcGIS的Python脚本编程Python的诸多特点使它可以作为ArcGIS的脚本语言,这些特点包括以下几方面. 简单且易学.相对于其他高度结构化的编程语言(C++或Visual Basic)而言,Python更容易被掌握.它的语法简单,编程者将有更多的时间来解决实际问题,而不需要在学习Python语言上耗费太多精力. 免费且开源.Python是一款免费并且开源的软件.用户可以自由地分发该软件的复本,查看和修改源代码,或者将其中一部分代码用在其他免费的程序里.