アップデート
Decimal
Xcode 10.0 では、が a の値であるDictionary<String: Decimal>
場合 (およびおそらく他の場合) に、この回答が間違った値を出力するようにする lldb バグがありました。この質問と回答およびSwift バグ レポート SR-8989を参照してください。このバグは Xcode 11 (おそらくそれ以前) で修正されました。
オリジナル
の生のビットを人間が読める文字列に変換する Python コードをインストールすることで、書式設定NSDecimal
(および Swift では)の lldb サポートを追加できます。これは型要約スクリプトと呼ばれ、lldb ドキュメントのこのページの「PYTHON SCRIPTING」の下に文書化されています。Foundation.Decimal
NSDecimal
タイプ サマリー スクリプトを使用する利点の 1 つは、ターゲット プロセスでコードを実行する必要がないことです。これは、特定のターゲットにとって重要な場合があります。
もう 1 つの利点は、ハイパークリプトの回答に見られるように、Xcode デバッガーの変数ビューが要約形式よりも型要約スクリプトでより確実に機能するように見えることです。要約形式に問題がありましたが、タイプ要約スクリプトは確実に機能します。
タイプ サマリー スクリプト(またはその他のカスタマイズ) がないと、Xcode はNSDecimal
(または Swift Decimal
) を次のように表示します。
型要約スクリプトを使用すると、 Xcode は次のように表示します。
タイプ サマリー スクリプトの設定には、次の 2 つの手順が含まれます。
スクリプト (以下を参照) をファイルに保存します。で保存しました~/.../lldb/Decimal.py
。
~/.lldbinit
スクリプトをロードするコマンドを追加します。コマンドは次のようになります。
command script import ~/.../lldb/Decimal.py
スクリプトを保存した場所へのパスを変更します。
これがスクリプトです。この要点にも保存しました。
# 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"')