たとえば、私は0x46767f0がNSString *に属していることを知っていますが、私が求めているいくつかのバグを見つけるのに役立つNSStringを見つける方法はありますか?
私はあなたが探していると信じています:
info symbol <addresss>
アドレスaddrに格納されているシンボルの名前を出力します。シンボルがaddrに正確に格納されていない場合、GDBは最も近いシンボルとそのオフセットを出力します。
例:
(gdb) info symbol 0x400225
_start + 5 in section .text of /tmp/a.out
(gdb) info symbol 0x2aaaac2811cf
__read_nocancel + 6 in section .text of /usr/lib64/libc.so.6
あなたはそれについてもっと読むことができます ここ 。
gdb>リスト* 0xAABBCCDD
ファイル名と行番号がわかります。
それがスタック変数である場合、私が気づく方法はありません。それ以外の場合は、p/a <pointer symbol or address>
とすると、シンボル名(または最も近いシンボル名へのオフセット)が出力されます。
po 0x46767f0
-description
メッセージをオブジェクトに送信します。 NSStringの内容が出力されますが、ランダムなアドレスにランダムなメッセージを送信する前に、ブライアンの回答を使用してアドレスの内容を確認することをお勧めします。
addr2line
このBinutilsユーティリティは、変数や関数名を含む、任意のシンボルアドレスを処理できます。
デフォルトでは非インタラクティブであり、事後分析を行う場合に便利です。
main.c
#include <stdio.h>
int myvar;
int main(void) {
printf("myvar = %d\n", myvar);
}
コンパイルと逆アセンブル:
gcc -O 0 -g gdb3 -o main -pedantic-errors -std=c89 -Wextra main.c
readelf -s tmp.out | grep -E ' (main|myvar)'
与える:
55: 0000000000201014 4 OBJECT GLOBAL DEFAULT 24 myvar
65: 000000000000064a 32 FUNC GLOBAL DEFAULT 14 main
そして今、私たちは試すことができます:
addr2line -e main 201014 64a
それは与える:
/full/path/to/main.c:3
/full/path/to/main.c:5
Boostスタックトレースライブラリは、たとえば、スタックトレース行を表示するためにそれを使用します。 CまたはC++の呼び出しスタックを出力