2

XCode 5 でのデバッグ セッション中に、NSDecimal 変数の実際の値を表示するにはどうすればよいですか? この質問を見つけましたが、うまくいきません。justのような要約説明を入力すると、{(int)[$VAR intValue]}「Summary Unavailable」というメッセージが表示されます。NSDecimals が配列 ( NSDecimal dataPoint[2];) にあることを追加する必要があります。

デバッグ コンソールを使用して、コンテキスト メニューまたは p を使用して var の説明を出力するdataPoint[0]と、生の NSDecimal ビューが得られます。

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
  }
}
4

2 に答える 2

5

アップデート

DecimalXcode 10.0 では、が a の値であるDictionary<String: Decimal>場合 (およびおそらく他の場合) に、この回答が間違った値を出力するようにする lldb バグがありました。この質問と回答およびSwift バグ レポート SR-8989を参照してください。このバグは Xcode 11 (おそらくそれ以前) で修正されました。

オリジナル

の生のビットを人間が読める文字列に変換する Python コードをインストールすることで、書式設定NSDecimal(および Swift では)の lldb サポートを追加できます。これは型要約スクリプトと呼ばれ、lldb ドキュメントのこのページの「PYTHON SCRIPTING」の下に文書化されています。Foundation.DecimalNSDecimal

タイプ サマリー スクリプトを使用する利点の 1 つは、ターゲット プロセスでコードを実行する必要がないことです。これは、特定のターゲットにとって重要な場合があります。

もう 1 つの利点は、ハイパークリプトの回答に見られるように、Xcode デバッガーの変数ビューが要約形式よりも型要約スクリプトでより確実に機能するように見えることです。要約形式に問題がありましたが、タイプ要約スクリプトは確実に機能します。

タイプ サマリー スクリプト(またはその他のカスタマイズ) がないと、Xcode はNSDecimal(または Swift Decimal) を次のように表示します。

タイプ要約スクリプトの前

型要約スクリプトを使用すると、 Xcode は次のように表示します。

タイプ要約スクリプトの後

タイプ サマリー スクリプトの設定には、次の 2 つの手順が含まれます。

  1. スクリプト (以下を参照) をファイルに保存します。で保存しました~/.../lldb/Decimal.py

  2. ~/.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"')
于 2018-10-10T22:41:11.483 に答える
3

最も簡単な方法はNSDecimalNumber、デバッガーでこれを に変換することです。つまり、

po [NSDecimalNumber decimalNumberWithDecimal:dataPoint[0]]

NSDecimalNumberこれにより、適切な説明を出力する new が作成されます。あなたのNSDecimal質問の は 8.5 です。

(lldb) po [NSDecimalNumber decimalNumberWithDecimal:dataPoint[0]]
8.5

数値を変数ビューに表示する場合、その集計形式は次のようになります。

{[NSDecimalNumber decimalNumberWithDecimal:$VAR]}:s
于 2013-10-12T11:27:37.907 に答える