gdb disassemble/rs
เพื่อแสดงซอร์สและไบต์ดิบด้วย
ด้วยรูปแบบนี้มันเข้าใกล้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, GDB 7.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
การตอบกลับรายชื่ออีเมล
มีเธรด 2010 ในรายชื่ออีเมลซึ่งระบุว่าเป็นไปไม่ได้: https://sourceware.org/ml/binutils/2010-04/msg00445.html
นอกเหนือจากgdb
วิธีแก้ปัญหาที่ Tom เสนอแล้วพวกเขายังแสดงความคิดเห็นเกี่ยวกับวิธีแก้ปัญหาอื่น (แย่กว่า) ของการรวบรวม-ffunction-section
ซึ่งทำให้หนึ่งฟังก์ชันต่อส่วนแล้วทิ้งส่วนนั้น
Nicolas Clifton ให้ WONTFIX https://sourceware.org/ml/binutils/2015-07/msg00004.htmlซึ่งอาจเป็นเพราะวิธีแก้ปัญหาของ GDB ครอบคลุมกรณีการใช้งานนั้น
static
คอมไพลเลอร์อาจแทรกเข้าไปในไซต์การเรียก นี่อาจหมายความว่าอาจไม่มีฟังก์ชั่นใด ๆ ในการถอดแยกชิ้นส่วนตามความเป็นจริง หากคุณสามารถมองเห็นสัญลักษณ์สำหรับฟังก์ชันอื่น ๆ แต่ไม่ใช่ฟังก์ชันที่คุณกำลังมองหานี่เป็นคำใบ้ที่ชัดเจนว่าฟังก์ชันนั้นอยู่ในแนวเส้น Valgrind อาจยังคงอ้างอิงถึงฟังก์ชันที่ระบุไว้ล่วงหน้าเดิมเนื่องจากข้อมูลการดีบักไฟล์ ELF จะจัดเก็บว่าคำสั่งแต่ละคำสั่งมาจากที่ใดแม้ว่าคำแนะนำจะถูกย้ายไปที่อื่นก็ตาม