当 SBValue 来自 Swift 字典时,SBData 是错误的

2023-12-21

我正在尝试编写一个Python函数来格式化Foundation.Decimal,用作类型摘要器。我把它发布在这个答案 https://stackoverflow.com/a/52749749/77567。我还将它包含在这个答案的底部,并带有额外的调试打印。

我现在发现了一个错误,但我不知道该错误是在我的函数中,还是在 lldb 中,或者可能在 Swift 编译器中。

这是演示该错误的文字记录。我加载我的类型摘要器~/.lldbinit,因此 Swift REPL 使用它。

:; xcrun swift
registering Decimal type summaries
Welcome to Apple Swift version 4.2 (swiftlang-1000.11.37.1 clang-1000.11.45.1). Type :help for assistance.
  1> import Foundation
  2> let dec: Decimal = 7
dec: Decimal = 7

上面,7调试器输出来自我的类​​型摘要器并且是正确的。

  3> var dict = [String: Decimal]()
dict: [String : Decimal] = 0 key/value pairs
  4> dict["x"] = dec
  5> dict["x"]
$R0: Decimal? = 7

上面,7再次来自我的类​​型总结器,并且是正确的。

  6> dict
$R1: [String : Decimal] = 1 key/value pair {
  [0] = {
    key = "x"
    value = 0
  }
}

上面,0 (in value = 0) 来自我的类​​型总结器,并且是不正确。它应该是7.

那么为什么它为零呢?我的 Python 函数被赋予SBValue。它调用GetData() on the SBValue得到一个SBData。我向函数添加了调试打印以打印中的字节SBData,并打印结果sbValue.GetLoadAddress()。这是带有这些调试打印的文字记录:

:; xcrun swift
registering Decimal type summaries
Welcome to Apple Swift version 4.2 (swiftlang-1000.11.37.1 clang-1000.11.45.1). Type :help for assistance.
  1> import Foundation
  2> let dec: Decimal = 7
dec: Decimal =    loadAddress: ffffffffffffffff
    data: 00 21 00 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 7

上面,我们可以看到加载地址是假的,但是加载的字节SBData是正确的(字节 1,21,包含长度和标志;字节 4,“07”,是有效数的第一个字节)。

  3> var dict = [String: Decimal]()
dict: [String : Decimal] = 0 key/value pairs
  4> dict["x"] = dec
  5> dict
$R0: [String : Decimal] = 1 key/value pair {
  [0] = {
    key = "x"
    value =    loadAddress: ffffffffffffffff
    data: 00 00 00 00 00 21 00 00 07 00 00 00 00 00 00 00 00 00 00 00
 0
  }
}

上面,我们可以看到加载地址仍然是假的,现在的字节SBData是不正确的。这SBData仍然包含 20 个字节(正确的数字Foundation.Decimal, aka NSDecimal),但现在有四个00字节已插入到前面,最后四个字节已被删除。

这是我的具体问题:

  1. 我是否错误地使用了 lldb API,从而得到了错误的答案?如果是这样,我做错了什么以及我应该如何纠正?

  2. 如果我正确使用 lldb API,那么这是 lldb 中的错误,还是 Swift 编译器发出不正确的元数据?如何找出哪个工具存在错误? (因为如果其中一个工具存在错误,我想提交错误报告。)

  3. 如果这是 lldb 或 Swift 中的错误,我该如何解决该问题,以便我可以格式化Decimal当它是 a 的一部分时正确地Dictionary?


这是我的类型格式化程序,带有调试打印:

# Decimal / NSDecimal support for lldb
#
# Put this file somewhere, e.g. ~/.../lldb/Decimal.py
# Then add this line to ~/.lldbinit:
#     command script import ~/.../lldb/Decimal.py

import lldb

def stringForDecimal(sbValue, internal_dict):
    from decimal import Decimal, getcontext

    print('    loadAddress: %x' % sbValue.GetLoadAddress())

    sbData = sbValue.GetData()
    if not sbData.IsValid():
        raise Exception('unable to get data: ' + sbError.GetCString())
    if sbData.GetByteSize() != 20:
        raise Exception('expected data to be 20 bytes but found ' + repr(sbData.GetByteSize()))

    sbError = lldb.SBError()
    exponent = sbData.GetSignedInt8(sbError, 0)
    if sbError.Fail():
        raise Exception('unable to read exponent byte: ' + sbError.GetCString())

    flags = sbData.GetUnsignedInt8(sbError, 1)
    if sbError.Fail():
        raise Exception('unable to read flags byte: ' + sbError.GetCString())
    length = flags & 0xf
    isNegative = (flags & 0x10) != 0

    debugString = ''
    for i in range(20):
        debugString += ' %02x' % sbData.GetUnsignedInt8(sbError, i)
    print('    data:' + debugString)

    if length == 0 and isNegative:
        return 'NaN'

    if length == 0:
        return '0'

    getcontext().prec = 200
    value = Decimal(0)
    scale = Decimal(1)
    for i in range(length):
        digit = sbData.GetUnsignedInt16(sbError, 4 + 2 * i)
        if sbError.Fail():
            raise Exception('unable to read memory: ' + sbError.GetCString())
        value += scale * Decimal(digit)
        scale *= 65536

    value = value.scaleb(exponent)
    if isNegative:
        value = -value

    return str(value)

def __lldb_init_module(debugger, internal_dict):
    print('registering Decimal type summaries')
    debugger.HandleCommand('type summary add Foundation.Decimal -F "' + __name__ + '.stringForDecimal"')
    debugger.HandleCommand('type summary add NSDecimal -F "' + __name__ + '.stringForDecimal"')

这看起来像一个 lldb 错误。请针对 lldb 提交有关此问题的错误http://bugs.swift.org http://bugs.swift.org.

背景知识:在字典案件中,你的背后发生了一些魔法。我无法在 REPL 中显示这一点,但如果您有一个 [String : Decimal] 数组作为某些实际代码中的局部变量,并且执行以下操作:

(lldb) frame variable --raw dec_array
(Swift.Dictionary<Swift.String, Foundation.Decimal>) dec_array = {
  _variantBuffer = native {
    native = {
      _storage = 0x0000000100d05780 {
        Swift._SwiftNativeNSDictionary = {}
        bucketCount = {
          _value = 2
        }
        count = {
          _value = 1
        }
        initializedEntries = {
          values = {
            _rawValue = 0x0000000100d057d0
          }
          bitCount = {
            _value = 2
          }
        }
        keys = {
          _rawValue = 0x0000000100d057d8
        }
        values = {
          _rawValue = 0x0000000100d057f8
        }
        seed = {
          0 = {
            _value = -5794706384231184310
          }
          1 = {
            _value = 8361200869849021207
          }
        }
      }
    }
    cocoa = {
      cocoaDictionary = 0x00000001000021b0
    }
  }
}

Swift Dictionary 实际上并不包含任何明显的字典元素,当然也不包含 ivars。因此,lldb 有一个用于 Swift 字典的“合成子提供程序”,它为字典的键和值组成 SBValues,它是格式化程序正在处理的那些合成子提供者之一。

这也是加载地址为-1的原因。这实际上意味着“这是一个合成的东西,其数据 lldb 直接管理,而不是程序中某个地址的东西。” REPL 结果也是如此,它们更像是 lldb 维护的虚构内容。但是,如果您查看 Decimal 类型的局部变量,您会看到一个有效的加载地址,因为它位于内存中的某个位置。

无论如何,显然我们用来表示字典值的 Synthetic 子 Decimal 对象没有正确设置数据的开头。有趣的是,如果您制作一个 [Decimal : String] 字典,则关键字段的 SBData 是正确的,并且您的格式化程序可以工作。只是价值观不正确而已。

我对以字符串作为值的字典尝试了同样的操作,并且 SBData 看起来是正确的。 Decimal 有一些有趣的地方。不管怎样,感谢您的关注,请提交错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当 SBValue 来自 Swift 字典时,SBData 是错误的 的相关文章

  • Xcode MyProjectName-Bridging-Header.h 不存在

    我想开始在我的 Objective C 项目中使用 Swift 所以我添加了一个快速类 import Foundation objc class System NSObject objc func printSome println Pri
  • UICollectionView 列的垂直偏移

    右图是我试图实现的目标 Does anyone know how I could achieve this on a two column UICollectionView I m able to discern my columns by
  • IOS Coredata 兼容 IOS 9 和 ios 10

    您好 我正在开发一个适用于 IOS 10 和 9 xcode 8 的应用程序 创建新实体对象的正确方法是什么 新的IOS 10有这个代码 var newEvent Event context context 我们如何让这段代码同时适用于 I
  • 使用原始类型+大小写参数的 Swift Enum 的解决方法?

    我想创建 SKSpriteNodesWallType 请参阅下面的代码 并且仅当WallType is Corner通过它Side其方向的价值 枚举具有原始值 因为我需要将它们作为数字从 plist 加载 并能够随机创建它们 enum Si
  • 在 macOS 10.14 上键入文本时,NSTextView 光标不出现

    我在 macOS 10 12 Mojave 上使用 NSTextView 观察到一个奇怪的问题 我正在更改 textStorage 属性didChangeText 像这样 self textStorage beginEditing ARTo
  • Sprite-kit:沿圆形路径移动元素

    我正在尝试让一个元素沿着圆圈的边缘移动 我在屏幕中间创建并放置了一个圆圈 var base SKShapeNode circleOfRadius 200 Size of Circle base position CGPointMake fr
  • 在 swift 中使用自定义字体[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要一个用于 swift sprite kit iOS 的字体 该字体用于商业目的 我正在尝试拥有一
  • UIAlertController 显示延迟

    我在我的应用程序上遇到了 UIAlertController 问题 现已迁移到 iOS8 其中包含日期选择器 下面是代码 UIAlertController AlertView UIAlertController alertControll
  • 如何在 Swift3.0 中居中对齐 UICollectionView 的单元格?

    描述 回答Objective C and Swift2 0 如何居中对齐 UICollectionView 的单元格 https stackoverflow com questions 13588283 how to center alig
  • Xcode 11 beta swift ui 预览未显示

    只是使用 Swift UI 基本应用程序 即使我处于画布模式 预览画布也不会显示 应用程序运行 我有这个小片段 我错过了什么 if DEBUG struct ContentView Previews PreviewProvider stat
  • 以编程方式快速呈现视图控制器

    您好 我正在尝试将以下目标 C 代码转换为 swift 以便在单击按钮时从一个视图控制器导航到另一个视图控制器 任何帮助将非常感激 这是摘自苹果的编程指南 void add id sender Create the root view co
  • 自定义过渡动画在animationControllerForPresentedController和animateTransition之间未知延迟

    我的目标是使动画在第一个视图控制器中开始并在第二个视图控制器中结束 我正在尝试使用符合以下条件的对象进行过渡动画UIViewControllerAnimatedTransitioning and UIViewControllerTransi
  • 如果在系统设置中关闭隐藏式字幕,则不会显示字幕

    我正在尝试显示字幕 无论设备在辅助功能下设置了什么 目前 如果设备设置为英语并在设置中启用隐藏式字幕 则将播放英语字幕 如果设备设置为西班牙语 则将播放西班牙语字幕 我希望无论隐藏式字幕是否打开 都能播放字幕 我尝试添加这段代码 https
  • 为什么我不能在 func Swift 中使用 self

    我试图自行将 SKSpriteNodes 添加到函数中的视图中 但 Xcode 不允许我这样做 它给了我错误 使用未解析的标识符 self func indicate if test 0 var large CGFloat largest
  • UITableView 干扰状态栏

    我正在开发一个具有 UITableViewController 的应用程序 该应用程序显示值列表 如下所示 如何将表格向下移动 使其不会与状态栏冲突 看来我无法对这个场景施加任何限制 所以我不知所措 使用以下 3 个属性UIViewCont
  • Swift 中的协议与多态性

    我对面向对象编程相当陌生 我正在尝试了解协议 委托和多态性 我最近观看了一个培训视频 其中宣传当您有两个相似且具有相似方法实现的类时 协议是优雅地实现此目的的最佳解决方案 这就说得通了 然而 一些额外的研究让我发现了多态性 听起来这也是一种
  • 使用随机初始密钥解码字典

    我正在接收并尝试解析包含事件数据的 json 文件 它是一个字典的字典 其组织方式如下 其中每个事件的键都是随机事件 id 19374176 122 event title Cool Fun Thing to Do description
  • 从两种不同类型的数组中获取公共数据

    struct Human let name String let id String let travelled String struct Animal let name String let id String let travelle
  • 在 SwiftUI 文档应用程序中,如何从函数内保存文档

    当前版本的 Xcode 版本 12 5 1 为 macOS 的基于文档的应用程序提供了一个模板 提供以下文档模型 struct MyDocument FileDocument var text String init text String
  • 动态获取协议的字符串表示形式

    我正在寻找一种从协议类型动态获取协议名称的方法 而不必使用 objc协议声明中的属性 我知道这有效 func keyForProtocol aProtocol Protocol gt String return NSStringFromPr

随机推荐

  • 安装nodejs后未定义require

    首先我从下载了node jslink https nodejs org en 然后我安装了browserifynpm install g browserify 然后我安装了fsnpm install fs 我收到以
  • 将 FindBugs 配置从 Sonar 导入到 Maven

    如何使用 Sonar 中的 FindBugs 配置文件作为规则集Maven FindBugs 插件 https gleclaire github io findbugs maven plugin 您可以放置 您的文件 即findbugs s
  • 非常大且非常稀疏的非负矩阵分解

    我有一个非常大且稀疏的矩阵 531K x 315K 单元格总数约为 1670 亿 非零值仅为 1s 非零值总数约为 45K 有高效的 NMF 包来解决我的问题吗 我知道有几个软件包可以实现这一点 并且它们仅适用于小尺寸的数据矩阵 任何想法都
  • WPF 将父绑定对象传递给转换器

    我有 ItemsControl 绑定到 Student 类型的集合 在 ItemTemplate 内部 我有一个 TextBox 它使用 IValueConverter 来执行一些自定义计算和逻辑 我想将实际的 Student 对象传递给值
  • 如何使用jquery在加载时滑动整个页面

    我想在更改时将整个页面向下滑动 我想做到这一点的方法是创建一个垂直幻灯片 在单击链接时播放 并在页面加载时再次播放 到目前为止 我只能创建影响特定 DIV 的幻灯片 我还希望它能够垂直滑入 任何想法将不胜感激 只需将所有内容包装在一个 di
  • 为什么应该仅在 1 个元素张量上或使用变量的梯度来调用向后函数?

    我是 pytorch 的新手 我想了解为什么我们不能对包含大小为 2 2 的张量的变量调用后向函数 如果我们确实想在包含大小为 2 2 的张量的变量上调用它 我们必须首先定义一个梯度张量 然后在包含张量 w r t 定义的梯度的变量上调用后
  • C# 如何使用 DataAnnotations StringLength 和 SubString 删除文本

    我有一个模型类 它有一个描述属性 其数据注释属性为 StringLength 长度设置为 100 个字符 当此属性超过 100 个字符并且实体框架尝试保存此属性时 我收到以下错误 StringLength 100 ErrorMessage
  • SQL:条件 AND in where

    我正在尝试创建一个允许省略参数的存储过程 但如果提供了参数则进行 AND 操作 CREATE PROCEDURE MyProcedure LastName Varchar 30 NULL FirstName Varchar 30 NULL
  • Apache Commons CLI - 订购帮助选项?

    我正在使用 Apache Commons CLI 默认情况下 它按字母顺序对命令行上的帮助选项进行排序 那么 出现的就是 csv ip msisdn xml 但我想按如下方式订购它们 csv xml ip msisdn 我知道您可以使用一个
  • 通过 Access 中的 ODBC 链接表更新 SQLite 数据库

    我在使用 SQLite 数据库时遇到问题 我正在使用 SQLite ODBChttp www ch werner de sqliteodbc http www ch werner de sqliteodbc 安装 64 位版本并使用以下设置
  • OpenERP (Odoo) 在哪里找到模块路径?

    我正在使用 Odoo v 8 我想找出 Odoo 在哪里找到模块所在的信息并加载它们 我知道文件 openerp server conf 中有一个变量 addons path 我找到该变量的唯一文件是 opt odoo odoo debia
  • Python:按索引过滤列表

    在Python中我有一个元素列表aList和索引列表myIndices 有什么方法可以一次检索所有这些项目aList将以下值作为索引myIndices Example gt gt gt aList a b c d e f g gt gt g
  • 在 JavaScript 中保存哈希/锚点更改的历史记录

    我目前正在实现一个 JavaScript 库 用于跟踪地址栏中哈希部分的更改历史记录 这个想法是 您可以在哈希部分保留一个状态 然后使用后退按钮返回到之前的状态 在大多数最新的浏览器中 这是自动的 您只需轮询location hash属性进
  • npm run 运行缓慢

    我曾经通过 Makefile 运行各种命令 但对于 Nodejs 项目来说 package json 是更合适的地方 通过 npm 运行命令效果很好 但与命令时间执行相比非常慢 time node modules bin jshint no
  • IIS 7.5 修复尝试加载格式不正确的程序问题?

    我遇到一个异常问题 抛出异常 尝试加载格式不正确的程序 错误 我在同一台 IIS 服务器上有两个相同的网站 我的构建配置适用于其中一个 但不适用于另一个 我的 C MVC 2 Web 应用程序可以部署到驻留在同一 IIS 7 5 Web 服
  • 有没有比 dict() 更快的东西?

    我需要一种更快的方式来存储和访问大约 3GB 的数据k v对 在哪里k是一个字符串或一个整数并且v is an np array 可以有不同的形状 是否有任何对象在存储和访问这样的表时比标准 python 字典更快 例如 一个pandas
  • SceneKit 在立方体测试中的性能

    在学习游戏 3D 图形编程时 我决定从使用 Scene Kit 3D API 开始简单 我的第一个游戏目标是构建一个非常简化的 我的世界 的模仿版 一个只有立方体的游戏 这有多难 下面是我编写的一个循环 用于放置 100 x 100 立方体
  • Fragments 中的“onViewStateRestored”如何工作?

    我真的对 Fragment 的内部状态感到困惑 我有一个活动一次只保存一个片段 并在应该显示另一个片段时替换它 来自文档onSaveInstanceState叫做ONLY如果活动onSaveInstanceState正在被调用 在我的例子中
  • 预加载图像的最佳方式

    预加载图像的最佳方法是什么 我正在尝试创建一个包含大约 59 张 png 图像的图像选项卡 这是我到目前为止的代码
  • 当 SBValue 来自 Swift 字典时,SBData 是错误的

    我正在尝试编写一个Python函数来格式化Foundation Decimal 用作类型摘要器 我把它发布在这个答案 https stackoverflow com a 52749749 77567 我还将它包含在这个答案的底部 并带有额外