2016-04-19 17 views
2

コンパイルされたファイルとデバッグシンボルを分割する方法については、次の投稿(How to generate gcc debug symbol outside the build target?)が見つかりました。デバッグシンボルからコンパイルされた変数/関数アドレスを見つける方法

しかし、私はデバッグファイルで有用な情報を見つけることができません。私が試した何が私に上の任意の情報を与えることはありません、GDBでgcc -g -o hello hello.c

objcopy --only-keep-debug hello hello.debug 
gdb -s main.debug -e main 

を走った

#include<stdio.h> 

int main(void) { 

    int a; 
    a = 5; 
    printf("The memory address of a is: %p\n", (void*) &a); 
    return 0; 
} 

、私は:

例えば、

私のHelloWorldコードがありますそのアドレスを見つけることができません、私は主な機能アドレスを見つけることができません

F例:

(gdb) info variables 
All defined variables: 

Non-debugging symbols: 
0x0000000000400618 _IO_stdin_used 
0x0000000000400710 __FRAME_END__ 
0x0000000000600e3c __init_array_end 
0x0000000000600e3c __init_array_start 
0x0000000000600e40 __CTOR_LIST__ 
0x0000000000600e48 __CTOR_END__ 
0x0000000000600e50 __DTOR_LIST__ 
0x0000000000600e58 __DTOR_END__ 
0x0000000000600e60 __JCR_END__ 
0x0000000000600e60 __JCR_LIST__ 
0x0000000000600e68 _DYNAMIC 
0x0000000000601000 _GLOBAL_OFFSET_TABLE_ 
0x0000000000601028 __data_start 
0x0000000000601028 data_start 
0x0000000000601030 __dso_handle 
0x0000000000601038 __bss_start 
0x0000000000601038 _edata 
0x0000000000601038 completed.6603 
0x0000000000601040 dtor_idx.6605 
0x0000000000601048 _end 

何か問題がありますか?デバッグファイルを間違って理解していますか?保存されたデバッグ情報からコンパイルされた変数/関数のアドレスを見つける方法さえありますか?

+0

「main」を削除するのを忘れました。他のすべてのことを正しい方法で削除しました。 'objcopy'の前と後のgdbの結果を比較しますか? – fghj

+0

私はそうではありません、それはどういう意味ですか? – Quantico

+0

私は、 'gdb'で動作しないファイルを別のファイルに抽出した後、デバッグ情報を分離する操作の前にgdbで動作しない' something'を試してみることをお勧めします。 – fghj

答えて

2

int aはスタック変数なので、その特定の関数を呼び出さない限り固定アドレスはありません。さらに、その関数を呼び出すたびに、独自の変数が割り当てられます。

「デバッグシンボル」とは、通常、関数とグローバル変数を意味します。この文脈では、ローカル変数は「シンボル」ではありません。実際、最適化を有効にしてコンパイルするとint aはレジスタ変数にほぼ確実に最適化されるため、some_function(&a)などを実行してメモリに書き込むことを強いられる場合を除き、アドレスはまったくありません。

mainのアドレスは、GDBにprint mainと書くだけで見つけることができます。これは、値コンテキストに現れたときに関数がCのポインタに暗黙的に変換され、GDBのprintがCのセマンティクスを使用するためです。

+0

私は参照してください。この詳細な説明をありがとうございます。私はCの新人で、物事を理解しようとしています。私はそのアドレスを抽出することができます変数を持っているコードの良いテストの例は何ですか? – Quantico

+0

関数呼び出し中に、その特定の呼び出しインスタンスのローカル変数のアドレスを取得できます。また、それをグローバル変数として宣言してから、独自のシンボルを取得することもできます。バイナリ内のすべてのシンボルを表示するには、 '' 'nm''を使ってみてください。また、私の答えがあなたにとって有益だったなら、upvotingとそれを受け入れることを検討してください。 – jforberg

+0

upvoted。私はまだそれを受け入れる前にいくつかのことを理解しようとしています。 nmの意味は?だから、ローカル変数のために私は関数呼び出しとブレークポイントを必要とし、実行中にそれをキャッチしてaのアドレスを見つけますか? – Quantico

関連する問題