ポインターが指す要素の配列を表示したいと思います。GDB では、指定されたメモリを指定された長さの人工配列として扱うことでこれを行うことができます。
*pointer @ length
length
表示したい要素の数はどこにありますか。
上記の構文は、Xcode 4.1 で提供される LLDB では機能しません。
LLDBで上記を達成する方法はありますか?
Xcode 8.0 の lldb から、新しい組み込みの parray コマンドがあります。したがって、次のように言えます。
(lldb) parray <COUNT> <EXPRESSION>
の結果が指すメモリを、式が指す型EXPRESSION
の要素の配列として出力します。COUNT
カウントが現在のフレームで使用可能な変数に格納されている場合は、次のことができることを覚えておいてください。
(lldb) parray `count_variable` pointer_to_malloced_array
これは lldb の一般的な機能です。バッククォートで囲まれた lldb のコマンドライン引数は、整数を返す式として評価され、コマンドの実行前に引数が整数に置き換えられます。
私が見つけた唯一の方法は、Python スクリプト モジュールを使用することでした。
""" File: parray.py """
import lldb
import shlex
def parray(debugger, command, result, dict):
args = shlex.split(command)
va = lldb.frame.FindVariable(args[0])
for i in range(0, int(args[1])):
print va.GetChildAtIndex(i, 0, 1)
lldb でコマンド「parray」を定義します。
(lldb) command script import /path/to/parray.py
(lldb) command script add --function parray.parray parray
これで、「parray variable length」を使用できます。
(lldb) parray a 5
(double) *a = 0
(double) [1] = 0
(double) [2] = 1.14468
(double) [3] = 2.28936
(double) [4] = 3.43404
Xcode 4.5.1 (現在は役に立たないかもしれません) では、lldb コンソールでこれを行うことができます:
(lldb) type summary add -s "${var[0-63]}" "float *"
(lldb) frame variable pointer
(float *) pointer = 0x000000010ba92950 [0.0,1.0,2.0,3.0, ... ,63.0]
この例では、'pointer' が 64 個の float の配列であると想定しています。float pointer[64];
まだサポートされていないようです。
次のようなメモリ読み取り関数(メモリ読み取り/ x)を使用できます。
(lldb) memory read -ff -c10 `test`
そのポインタからフロートを10回印刷します。これは、gdbの@と同じ機能である必要があります。
Martin R answer から始めて、次のように改善しました。
ポインターが単純な変数でない場合、たとえば:
struct {
int* at;
size_t size;
} a;
次に、「parray a.at 5」は失敗します。
「FindVariable」を「GetValueForVariablePath」に置き換えることでこれを修正しました。
配列内の要素が集約である場合はどうでしょうか。たとえば、次のようになります。
struct {
struct { float x; float y; }* at;
size_t size;
} a;
次に、「parray a.at 5」は次のように出力します: a.at->x、a.at->y、a.at[2]、a.at[3]、a.at[4]。骨材の。
「a.at」を解決してからその子を取得する代わりに、ループ内で「a.at」+「[」+ str(i) +「]」を解決することでこれを修正しました。
オプションの「最初の」引数 (使用法: parray [FIRST] COUNT) が追加されました。これは、膨大な数の要素がある場合に役立ちます。
初期化時に「command script add -f parray.parray parray」を実行するようにしました
ここに私の修正版があります:
import lldb
import shlex
def parray(debugger, command, result, dict):
args = shlex.split(command)
if len(args) == 2:
count = int(args[1])
indices = range(count)
elif len(args) == 3:
first = int(args[1]), count = int(args[2])
indices = range(first, first + count)
else:
print 'Usage: parray ARRAY [FIRST] COUNT'
return
for i in indices:
print lldb.frame.GetValueForVariablePath(args[0] + "[" + str(i) + "]")
def __lldb_init_module(debugger, internal_dict):
debugger.HandleCommand('command script add -f parray.parray parray')
その時点で、独自のカスタム C 関数を作成し、次のように呼び出すこともできます。
call (int)myprint(args)