web-dev-qa-db-ja.com

GDBのメモリアドレスのシンボル名を取得する方法

たとえば、私は0x46767f0がNSString *に属していることを知っていますが、私が求めているいくつかのバグを見つけるのに役立つNSStringを見つける方法はありますか?

37
Coocoo4Cocoa

私はあなたが探していると信じています:

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

あなたはそれについてもっと読むことができます ここ

52

gdb>リスト* 0xAABBCCDD

ファイル名と行番号がわかります。

13
Jay Ram

それがスタック変数である場合、私が気づく方法はありません。それ以外の場合は、p/a <pointer symbol or address>とすると、シンボル名(または最も近いシンボル名へのオフセット)が出力されます。

5
Simon Broadhead

po 0x46767f0

-descriptionメッセージをオブジェクトに送信します。 NSStringの内容が出力されますが、ランダムなアドレスにランダムなメッセージを送信する前に、ブライアンの回答を使用してアドレスの内容を確認することをお勧めします。

3
Rog

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++の呼び出しスタックを出力