คุณจะดึงข้อมูลตัวแปรโลคัล (ที่อยู่และประเภท) จากโปรแกรม Delphi หรือข้อมูลดีบักที่สร้างโดยคอมไพเลอร์ได้อย่างไร


105

เป้าหมายของฉันคือ:

  • ให้เธรดที่ถูกระงับในโปรแกรม Windows 32 หรือ 64 บิตที่คอมไพล์เดลฟีเพื่อเดินสแต็ก (doable)
  • กำหนดรายการสแต็กเพื่อแจกแจงตัวแปรโลคัลในแต่ละวิธีและค่าของตัวแปร นั่นคืออย่างน้อยที่สุดให้ค้นหาที่อยู่และประเภทของพวกเขา (จำนวนเต็ม 32/64 / ลงนาม / ไม่ได้ลงนาม, สตริง, ลอย, บันทึก, คลาส ... ) ชุดค่าผสมที่สามารถใช้เพื่อค้นหาค่าได้

ข้อแรกใช้ได้ดีและเป็นคำถามที่สองเกี่ยวกับคำถามนี้ ในระดับสูงคุณจะแจกแจงตัวแปรโลคัลจากรายการสแต็กใน Delphi ได้อย่างไร


ในระดับต่ำนี่คือสิ่งที่ฉันกำลังตรวจสอบ:

RTTI:ไม่แสดงรายการข้อมูลประเภทนี้เกี่ยวกับวิธีการ นี่ไม่ใช่สิ่งที่ฉันเคยคิดว่าเป็นตัวเลือกที่สมจริง แต่มีรายชื่ออยู่ที่นี่

ข้อมูลการดีบัก:กำลังโหลดข้อมูลการดีบักที่สร้างขึ้นสำหรับรุ่นดีบัก

  • ไฟล์แผนที่: แม้แต่ไฟล์แผนที่โดยละเอียด (ไฟล์รูปแบบข้อความ! เปิดไฟล์หนึ่งแล้วดู) ไม่มีข้อมูลตัวแปรในเครื่อง โดยทั่วไปจะเป็นรายการที่อยู่และหมายเลขบรรทัดไฟล์ต้นฉบับ เหมาะสำหรับการระบุแอดเดรสกับไฟล์และความสัมพันธ์ของเส้นเช่นจุดสีน้ำเงินในรางน้ำ ไม่ดีสำหรับข้อมูลรายละเอียดเพิ่มเติม
  • ข้อมูลการดีบักระยะไกล (ไฟล์ RSM) - ไม่มีข้อมูลที่ทราบเกี่ยวกับเนื้อหาหรือรูปแบบ
  • ไฟล์ TD32 / TDS:สายงานวิจัยปัจจุบันของฉัน มีสัญลักษณ์ทั่วโลกและในท้องถิ่นท่ามกลางข้อมูลอื่น ๆ มากมาย

ปัญหาที่ฉันพบคือ:

  • ไม่มีเอกสารเกี่ยวกับรูปแบบไฟล์ TD32 (ที่ฉันสามารถหาได้)
  • ความรู้ส่วนใหญ่ของฉันเกี่ยวกับพวกเขามาจากรหัส Jedi JCL ที่ใช้พวกเขา (JclTD32.pas) และฉันไม่แน่ใจว่าจะใช้รหัสนั้นอย่างไรหรือว่าโครงสร้างต่างๆมีมากมายเพียงพอที่จะแสดงตัวแทนในพื้นที่หรือไม่ ฉันค่อนข้างมั่นใจว่ามันจะจัดการกับสัญลักษณ์ระดับโลกได้ แต่ฉันไม่แน่ใจเกี่ยวกับท้องถิ่นมาก มีค่าคงที่หลากหลายที่กำหนดไว้และไม่มีเอกสารประกอบสำหรับรูปแบบหากต้องการอ่านความหมายฉันก็เดาไม่ออก อย่างไรก็ตามค่าคงที่และชื่อเหล่านั้นต้องมาจากที่ไหนสักแห่ง
  • แหล่งที่ฉันสามารถค้นหาได้โดยใช้ข้อมูล TDSไม่โหลดหรือจัดการกับสัญลักษณ์ในเครื่อง

หากนี่เป็นแนวทางที่ถูกต้องคำถามนี้จะกลายเป็น "มีเอกสารสำหรับรูปแบบไฟล์ TDS / TD32 หรือไม่และมีตัวอย่างโค้ดใดบ้างที่โหลดตัวแปรภายในเครื่อง"

ตัวอย่างโค้ดไม่จำเป็น แต่อาจมีประโยชน์มากแม้ว่าจะน้อยมากก็ตาม


2
ฉันไม่ได้ใช้หน่วย Jedi JCL เพื่อเข้าถึงข้อมูล TD32 จริงๆ - ฉันมีไลบรารีที่เป็นกรรมสิทธิ์ของตัวเองสำหรับสิ่งนั้น แต่ดูเหมือนว่าระบบประปาพื้นฐานทั้งหมดที่คุณต้องการจะมีอยู่ใน JclTD32.pas ไม่มีรหัสสาธิตที่ฉันสามารถค้นหาเพื่อเข้าถึงข้อมูลตัวแปร แต่ตัวอย่างที่มี (ใน .. \ jcl \ samples \ windows \ debug \ sourceloc) แสดงวิธีรับข้อมูลหมายเลขบรรทัดจากข้อมูล TD32 ดังนั้น คุณควรจะสร้างสิ่งนั้นขึ้นมาเพื่อให้ได้สิ่งที่คุณต้องการ โปรดรายงานสิ่งที่คุณพบกลับมาที่นี่ :)
500 - ข้อผิดพลาดเซิร์ฟเวอร์ภายใน

2
@ 500-InternalServerError ขอบคุณ ข้อมูลหมายเลขบรรทัดเป็นเรื่องง่าย (แม้ว่าจะอยู่ในไฟล์แผนที่ก็ตาม) แต่คุณสามารถให้ข้อมูลเกี่ยวกับสิ่งที่คุณเห็นในรหัส JCL ที่เกี่ยวข้องกับสัญลักษณ์ท้องถิ่นโดยเฉพาะได้หรือไม่? นอกจากนี้ด้วยความอยากรู้อยากเห็นห้องสมุดที่เป็นกรรมสิทธิ์ของ TD32 ของคุณคืออะไรและมีการเผยแพร่ / ใช้งานแบบสาธารณะหรือภายในองค์กรเท่านั้น?
David

3
สัญลักษณ์โพรซีเดอร์ / ฟังก์ชัน / วิธีการที่อยู่ข้างใต้แต่ละสัญลักษณ์จะมีรายการสัญลักษณ์ที่อยู่ในระบบ คำจำกัดความส่วนใหญ่ดูเหมือนจะมีอยู่ในหน่วยเจได แต่มีบางส่วนแสดงความคิดเห็น คำแนะนำของฉันคือสร้างแอปทดสอบขนาดเล็กและดูว่าการแจกแจงของสัญลักษณ์ส่งกลับอะไร รหัสที่ฉันมีเป็นกรรมสิทธิ์และไม่ใช่สำหรับฉันที่จะเผยแพร่ มันไม่ครอบคลุมหัวข้อของตัวแปรท้องถิ่นอยู่ดี แต่ข้อมูลที่อ้างอิงนั้นเป็นข้อมูลกึ่งสาธารณะดังนั้นฉันอาจช่วยได้หากคุณเจอกำแพงที่เฉพาะเจาะจง
500 - ข้อผิดพลาดภายในเซิร์ฟเวอร์

4
tds2pdb ( code.google.com/p/map2dbg ) ดูเหมือนว่าจะมีตัวแยกวิเคราะห์สำหรับไฟล์ tds เป็นรหัส C # แม้ว่า
Graymatter

4
เคยมีเอกสารที่ไม่เป็นทางการใช่แล้ว แต่ Borland (ในเวลานั้น) ตัดสินใจที่จะปล่อย dll แทนสำหรับการเข้าถึงข้อมูลการดีบักเพื่อให้พวกเขาสามารถเปลี่ยนรูปแบบภายในและไม่ต้องอัปเดตเอกสาร ขออภัยฉันไม่พบทั้งเอกสารต้นฉบับหรือ dll ในตอนนี้ ฉันขอแนะนำให้คุณติดต่อฝ่ายสนับสนุนด้านเทคนิคของ Embarcadero และสอบถามเกี่ยวกับเรื่องนี้
500 - ข้อผิดพลาดภายในเซิร์ฟเวอร์

คำตอบ:


2

ตรวจสอบว่าสัญลักษณ์การดีบักใด ๆ ไม่ได้อยู่ในไบนารี นอกจากนี้ยังเป็นไปได้คือใช้ GDB (บนพอร์ตของ Windows) จะเป็นการดีมากถ้าคุณพบไฟล์. dbg หรือ. dSYM ซึ่งประกอบด้วยซอร์สโค้ดเช่น

gdb> list foo
56 void foo()
57 {
58  bar();
59  sighandler_t fnc = signal(SIGHUP, SIG_IGN);
60  raise(SIGHUP);
61  signal(SIGHUP, fnc);
62  baz(fnc);
63 }

หากคุณไม่มีไฟล์ดีบักคุณอาจลองรับ MinGW หรือ Cygwin แล้วใช้ nm (1) ( man page ) มันจะอ่านชื่อสัญลักษณ์จากไบนารี อาจมีบางประเภทเช่น C ++:

int abc::def::Ghi::jkl(const std::string, int, const void*)

อย่าลืมเพิ่ม--demangleตัวเลือกมิฉะนั้นคุณจะได้รับสิ่งที่ต้องการ:

__ZN11MRasterFont21getRasterForCharacterEh

แทน:

MRasterFont::getRasterForCharacter(unsigned char)

2
Jakub ขอบคุณสำหรับคำตอบ น่าเสียดายที่ฉันอาจต้องอ่านรูปแบบการดีบักเฉพาะ - TDS แอป Delphi ไม่ได้รวบรวมข้อมูลการดีบักที่เข้ากันได้กับ GDB บน ​​Windows ฉันไม่แน่ใจว่า nm จะช่วยได้อย่างไรเนื่องจากจะอาศัยรูปแบบไฟล์ดีบักเฉพาะซึ่งอาจไม่ใช่รูปแบบที่ Delphi สร้างขึ้น หรือฉันเข้าใจคำตอบของคุณผิด - GDB สามารถอ่านสัญลักษณ์ของเดลฟีได้หรือไม่
เดวิด

@DavidM ความคิดเห็นของคุณสำคัญมาก ลองหาพอร์ตของ GNU Binutils หรือ GNU Debugger บน Windows (ฉันรู้จักเฉพาะพอร์ต Binutils) มีไลบรารี BFD สำหรับ GDB นอกจากนี้ยังใช้ใน Binutils อนุญาตให้อ่านไฟล์หลายรูปแบบและจดจำได้ด้วยตัวเลขมหัศจรรย์ stringsหากทุกอย่างล้มเหลวใช้เครื่องมือที่เรียกว่า มันจะแยกสตริงจากไฟล์ไบนารีใด ๆ ดูหน้าคน สิ่งนี้จะพิมพ์สตริงซึ่งอาจแต่ไม่จำเป็นต้องมีประโยชน์
Top Sekret

0

ดูที่http://download.xskernel.org/docs/file%20formats/omf/borland.txt Open Architecture Handbook มันเก่า แต่บางทีคุณอาจพบข้อมูลที่เกี่ยวข้องเกี่ยวกับรูปแบบไฟล์


คุณช่วยเพิ่มบริบทได้ไหมลิงก์อาจใช้งานไม่ได้ในอนาคต
Hintham

ลิงก์มีเอกสารอย่างเป็นทางการจากบอร์แลนด์เกี่ยวกับรูปแบบไฟล์ OMF ที่ใช้โดยคอมไพเลอร์ Borland และรูปแบบไฟล์ไบนารีอื่น ๆ ที่ Borland ใช้ หลายปีก่อนฉันได้ดูรูปแบบไฟล์ TDS และดูเหมือนว่ามีบางส่วนที่เข้ากันได้กับรูปแบบไฟล์เอกสาร เมื่อพยายามรวบรวมข้อมูลใด ๆ เกี่ยวกับตัวแปรโลคัลจากไฟล์ TDS ควรใช้เอกสารที่เชื่อมโยงหรืออ้างอิง หากลิงก์เสียคำตอบของฉันจะไร้ประโยชน์และข้อมูลที่จำเป็นจะหายไป "คู่มือสถาปัตยกรรมแบบเปิด" ที่เชื่อมโยงกันเป็นส่วนหนึ่งของ Turbo Pascal และ C รุ่นเก่า
Muetze1
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.