gpt4 book ai didi

objective-c - 在 XCode 调试器中显示 NSDecimal 值

转载 作者:行者123 更新时间:2023-12-05 09:23:44 26 4
gpt4 key购买 nike

在使用 XCode 5 的调试 session 期间,我将如何显示 NSDecimal var 的实际值?我找到了 this question但这对我不起作用。输入类似 {(int)[$VAR intValue]} 的摘要描述只会导致消息“Summary Unavailable”。我应该补充一点,我的 NSDecimals 在一个数组中 (NSDecimal dataPoint[2];)。

使用调试控制台通过上下文菜单或使用 p dataPoint[0] 打印 var 描述只是给我原始的 NSDecimal View :

Printing description of dataPoint[0]:
(NSDecimal) [0] = {
_exponent = -1
_length = 1
_isNegative = 0
_isCompact = 1
_reserved = 0
_mantissa = {
[0] = 85
[1] = 0
[2] = 42703
[3] = 65236
[4] = 65534
[5] = 65535
[6] = 23752
[7] = 29855
}
}

最佳答案

更新

在 Xcode 10.0 中,有一个 lldb 错误,如果 Decimal 则此答案会打印出错误的值。是 Dictionary<String: Decimal> 中的一个值(可能在其他情况下)。参见 this question and answerSwift bug report SR-8989 .该错误已由 Xcode 11(可能更早)修复。

原创

您可以添加 lldb 对格式化的支持 NSDecimal (并且,在 Swift 中, Foundation.Decimal )通过安装 Python 代码来转换 NSDecimal 的原始位到人类可读的字符串。这称为类型摘要脚本,记录在 this page of the lldb documentation 上的“PYTHON SCRIPTING”下。 .

使用类型摘要脚本的一个优点是它不涉及在目标进程中运行代码,这对于某些目标可能很重要。

另一个优点是,Xcode 调试器的变量 View 似乎在使用类型摘要脚本时比使用摘要格式更可靠,如 hypercrypt's answer 中所示。 .我在摘要格式方面遇到了麻烦,但类型摘要脚本工作可靠。

没有类型摘要脚本(或其他定制),Xcode 显示 NSDecimal (或 Swift Decimal )像这样:

before type summary script

对于类型摘要脚本,Xcode 显示如下:

after type summary script

设置类型摘要脚本包括两个步骤:

  1. 将脚本(如下所示)保存在某个文件中。我保存在~/.../lldb/Decimal.py .

  2. 添加命令到~/.lldbinit加载脚本。该命令应如下所示:

    command script import ~/.../lldb/Decimal.py

    将路径更改为您存储脚本的位置。

这是脚本。我也保存在this gist里面了.

# 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

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

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"')

关于objective-c - 在 XCode 调试器中显示 NSDecimal 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19333589/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com