ฉันจะดูรหัสประกอบของโปรแกรม C ++ ได้อย่างไร


136

ฉันจะดูรหัสประกอบของโปรแกรม C ++ ได้อย่างไร

เครื่องมือยอดนิยมในการทำเช่นนี้มีอะไรบ้าง?


Microsoft Visual C ++ Express ตั้งค่าเบรกพอยต์แล้วกดAlt +8
jyz

สามารถทำซ้ำได้: stackoverflow.com/questions/137038/…
legends2k

คำตอบ:


169

สอบถามผู้เรียบเรียง

หากคุณกำลังสร้างโปรแกรมด้วยตัวเองคุณสามารถขอให้คอมไพเลอร์ของคุณปล่อยแหล่งที่มาของการประกอบ สำหรับคอมไพเลอร์ UNIX ส่วนใหญ่ใช้-Sสวิตช์

  • หากคุณใช้-g -Wa,-alhแอสเซมเบลอร์ GNU การคอมไพล์จะให้ซอร์สแบบผสมและแอสเซมบลีบน stdout ( -Waขอให้ไดรเวอร์คอมไพลเลอร์ส่งตัวเลือกไปยัง-alแอสเซมเบลอร์เปิดรายการแอสเซมบลีและ-ahเพิ่มรายการ "แหล่งที่มาระดับสูง"):

    g++ -g -c -Wa,-alh foo.cc

  • สำหรับ Visual Studio ให้ใช้/FAscไฟล์.

มองเข้าไปในไบนารี

หากคุณรวบรวมไบนารี

  • ใช้objdump -d a.outกับ UNIX (ใช้ได้กับ cygwin)
  • dumpbin /DISASM foo.exe บน Windows

ใช้ดีบักเกอร์ของคุณ

ผู้แก้ปัญหาอาจแสดงความไม่พอใจได้เช่นกัน


35

ใน GCC / G ++ คอมไพล์ด้วย-S. ที่จะส่งออกsomething.sไฟล์ที่มีรหัสแอสเซมบลี

แก้ไข: หากคุณต้องการให้ผลลัพธ์เป็นไวยากรณ์ของ Intel (ซึ่งก็คือ IMO ซึ่งอ่านได้ง่ายกว่ามากและแบบฝึกหัดการประกอบส่วนใหญ่ใช้) ให้คอมไพล์ด้วย-masm=intel.


5
เพิ่ม-fverbose-asmตัวเลือกด้วย
osgx

23

ใน Visual Studio ;

  1. ตั้งเบรกพอยต์
  2. รันโปรแกรมจนกว่าจะหยุดที่จุดพัก
  3. คลิกขวาที่รหัสแหล่งที่มาและเลือก "แสดงการแยกชิ้นส่วน"

15

สำหรับ gcc / g ++

gcc -save-temps -fverbose-asm prog.c

สิ่งนี้จะสร้าง prog.s พร้อมความคิดเห็นเกี่ยวกับตัวแปรที่ใช้ในทุกบรรทัด asm:

    movl    $42, -24(%ebp)  #, readme
    movl    -16(%ebp), %eax # pid, pid
    movl    %eax, 4(%esp)   # pid,
    movl    $.LC0, (%esp)   #,
    call    printf  #


6

หลายคนบอกวิธีการส่งรหัสแอสเซมบลีด้วยคอมไพเลอร์ที่กำหนดแล้ว อีกวิธีหนึ่งคือการรวบรวมไฟล์ออบเจ็กต์และถ่ายโอนข้อมูลด้วยเครื่องมือเช่นobjdump , readelf (บน Unix) หรือ DUMPBIN ( ลิงก์ ) (บน Windows) คุณยังสามารถถ่ายโอนไฟล์ปฏิบัติการได้ แต่จะอ่านผลลัพธ์ได้ยากขึ้น

สิ่งนี้มีข้อดีของการทำงานในลักษณะเดียวกันกับคอมไพเลอร์ใด ๆ


6

ไม่ว่าคุณจะใช้ดีบักเกอร์ใดก็ตามควรมีมุมมองแอสเซมบลี (Visual Studio, Borland IDE, gdb ฯลฯ ) หากคุณไม่ได้ใช้ดีบักเกอร์และเพียงต้องการดูว่าแอสเซมบลีใดอยู่ในโปรแกรมคุณสามารถใช้ตัวแยกชิ้นส่วนหรือเรียกใช้โปรแกรมและแนบเข้ากับดีบักเกอร์และทำการดัมพ์จากที่นั่น ดูข้อมูลอ้างอิงเกี่ยวกับตัวแยกชิ้นส่วนสำหรับข้อมูลเกี่ยวกับตัวเลือกต่างๆ


5

ดังที่มีคนกล่าวถึงดีบักเกอร์ของแพลตฟอร์มของคุณเป็นจุดเริ่มต้นที่ดี สำหรับนักแก้ไขบั๊กและตัวถอดชิ้นส่วนทั้งหมดให้ดูที่IDA Pro

บนแพลตฟอร์ม Unix / Linux (รวมถึง Cygwin) คุณสามารถobjdump --disassemble <executable>ใช้ได้


หากมีตัวเลือกให้คอมไพลเลอร์สร้างแอสเซมเบลอร์ (เช่น gcc -S หรืออ็อพชัน VS / FA ด้านล่าง) จะดีกว่าการถอดแยกชิ้นส่วน มันเป็นสัญลักษณ์มากกว่า
Marco van de Voort

แน่นอนถ้าคุณมีแหล่งที่มา
Ori Pessach

2
อย่างไรก็ตามคุณจะประหลาดใจว่า IDA Pro สามารถอนุมานข้อมูลสัญลักษณ์ได้มากเพียงใด
Ori Pessach

5

คอมไพเลอร์ส่วนใหญ่มีตัวเลือกในการส่งออกรายการแอสเซมบลี เช่นด้วย VisualStudio คุณสามารถใช้สิ่งต่างๆเช่น:

cl.exe /FAfile.asm file.c

เพื่อให้อ่านง่ายที่สุดดีบักเกอร์ส่วนใหญ่จะเสนอมุมมองที่สอดแทรกการถอดชิ้นส่วนกับแหล่งต้นฉบับดังนั้นคุณสามารถเปรียบเทียบโค้ดของคุณกับบรรทัดเอาต์พุตของคอมไพเลอร์ทีละบรรทัด



3

คุณสามารถลองใช้เว็บไซต์นี้: http://assembly.ynh.io/

ที่นั่นคุณสามารถวางรหัส C หรือ C ++ แล้วกดปุ่มสีน้ำเงินเพื่อดูเวอร์ชันที่เทียบเท่าแอสเซมบลี


FYI โหลดไม่ได้
kaiwan

ใช่ย้อนกลับไปในปี 2015 มันใช้งานได้ดีแล้วมันก็หยุดลงทันที จากนั้นก็มาถึง ctoassembly.com แต่มันใช้งานได้เพียงชุดย่อยของ C เท่านั้นที่เกิดขึ้นเดียวกัน: ไม่โหลดอีกต่อไป เลวร้ายเกินไป.
Gomes JA

2

ใน Visual Studio คุณสามารถสร้างรายการแอสเซมเบลอร์สำหรับโปรเจ็กต์ C ++

ไปที่คุณสมบัติโปรเจ็กต์จากนั้นไปที่ C ++ / ไฟล์เอาต์พุตและตั้งค่าการตั้งค่า Assembler Output และตำแหน่งรายการ ASM เป็นชื่อไฟล์


1

ใน Intel Mac OS X 10.8 (Mountain Lion) -masm=intelคำสั่งไม่ทำงาน อย่างไรก็ตามหากคุณติดตั้งXcodeควรติดตั้งเครื่องมือชื่อ 'otool':

otool code.o -tV

คุณต้องระบุรหัสออบเจ็กต์ที่คอมไพล์แล้วเป็นพารามิเตอร์


0

หากคุณเป็นผู้ใช้ Eclipse, คุณสามารถใช้มุมมองถอด

มุมมอง Disassembly แสดงโปรแกรมที่โหลดเป็นคำสั่งแอสเซมเบลอร์ผสมกับซอร์สโค้ดเพื่อเปรียบเทียบ บรรทัดการดำเนินการในปัจจุบันจะระบุด้วยเครื่องหมายลูกศรและไฮไลต์ในมุมมอง คุณสามารถทำงานต่อไปนี้ได้ในมุมมอง Disassembly:

  • ตั้งค่าจุดพักที่จุดเริ่มต้นของคำสั่งแอสเซมเบลอร์
  • เปิดใช้งานและปิดใช้งานเบรกพอยต์และตั้งค่าคุณสมบัติ
  • ทำตามขั้นตอนการถอดชิ้นส่วนของโปรแกรมของคุณ
  • ข้ามไปที่คำแนะนำเฉพาะในโปรแกรม

อธิบายละเอียดหน่อยได้ไหม
Peter Mortensen

นอกจากนี้ยังมีมุมมองการประกอบเมื่อดีบักใน MSVC
phuclv

ฉันไม่มีสภาพแวดล้อมการพัฒนา Eclipse C ++ ที่ใช้งานได้ในตอนนี้ แต่นี่คือเอกสารอย่างเป็นทางการ: help.eclipse.org/kepler/…
Pieter
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.