disassemble/rs
ソースバイトとrawバイトも表示するgdb
このフォーマットでは、objdump -S
出力に非常に近くなります。
gdb -batch -ex "disassemble/rs $FUNCTION" "$EXECUTABLE"
main.c
#include <assert.h>
int myfunc(int i) {
i = i + 2;
i = i * 2;
return i;
}
int main(void) {
assert(myfunc(1) == 6);
assert(myfunc(2) == 8);
return 0;
}
コンパイルして分解する
gcc -O0 -ggdb3 -std=c99 -Wall -Wextra -pedantic -o main.out main.c
gdb -batch -ex "disassemble/rs myfunc" main.out
分解:
Dump of assembler code for function myfunc:
main.c:
3 int myfunc(int i) {
0x0000000000001135 <+0>: 55 push %rbp
0x0000000000001136 <+1>: 48 89 e5 mov %rsp,%rbp
0x0000000000001139 <+4>: 89 7d fc mov %edi,-0x4(%rbp)
4 i = i + 2;
0x000000000000113c <+7>: 83 45 fc 02 addl $0x2,-0x4(%rbp)
5 i = i * 2;
0x0000000000001140 <+11>: d1 65 fc shll -0x4(%rbp)
6 return i;
0x0000000000001143 <+14>: 8b 45 fc mov -0x4(%rbp),%eax
7 }
0x0000000000001146 <+17>: 5d pop %rbp
0x0000000000001147 <+18>: c3 retq
End of assembler dump.
Ubuntu 16.04、GDB7.11.1でテスト済み。
objdump + awkの回避策
/unix/82944/how-to-grep-for-text-in-a-file-and-display-the-paragraph-that-has-theで言及されているように段落を印刷します-テキスト
objdump -d main.out | awk -v RS= '/^[[:xdigit:]]+ <FUNCTION>/'
例えば:
objdump -d main.out | awk -v RS= '/^[[:xdigit:]]+ <myfunc>/'
ちょうど与える:
0000000000001135 <myfunc>:
1135: 55 push %rbp
1136: 48 89 e5 mov %rsp,%rbp
1139: 89 7d fc mov %edi,-0x4(%rbp)
113c: 83 45 fc 02 addl $0x2,-0x4(%rbp)
1140: d1 65 fc shll -0x4(%rbp)
1143: 8b 45 fc mov -0x4(%rbp),%eax
1146: 5d pop %rbp
1147: c3 retq
を使用する場合-S
、コードコメントには可能なシーケンスが含まれている可能性があるため、失敗を防ぐ方法はないと思います...しかし、以下はほとんど常に機能します。
objdump -S main.out | awk '/^[[:xdigit:]]+ <FUNCTION>:$/{flag=1;next}/^[[:xdigit:]]+ <.*>:$/{flag=0}flag'
適応元:awk / sedで複数回発生する可能性のある2つのマーカーパターン間の線を選択する方法
メーリングリストの返信
メーリングリストには不可能だという2010年のスレッドがあります:https://sourceware.org/ml/binutils/2010-04/msg00445.html
gdb
Tomによって提案された回避策に加えて、-ffunction-section
セクションごとに1つの関数を配置し、セクションをダンプするコンパイルの別の(より悪い)回避策についてもコメントしています。
Nicolas Cliftonは、WONTFIXhttps : //sourceware.org/ml/binutils/2015-07/msg00004.htmlを提供しました。これはおそらくGDBの回避策がそのユースケースをカバーしているためです。
static
、コンパイラによってその呼び出しサイトにインライン化される可能性があります。これは、それ自体を分解する機能が実際にはない可能性があることを意味する場合があります。他の関数のシンボルを見つけることができるが、探している関数が見つからない場合、これは関数がインライン化されていることを強く示唆しています。ELFファイルのデバッグ情報には、命令が別の場所に移動された場合でも、個々の命令の発信元が格納されるため、Valgrindは元の事前インライン関数を参照する場合があります。