2015-05-01 10 views
105

Mục tiêu của tôi là:Làm thế nào để bạn trích xuất thông tin biến cục bộ (địa chỉ và loại) từ một chương trình Delphi hoặc thông tin gỡ lỗi do trình biên dịch tạo ra?

  • Với một sợi lơ lửng trong một chương trình Windows 32 hoặc 64-bit Delphi biên dịch, đi lại ngăn xếp (doable)
  • Với mục ngăn xếp, liệt kê các biến địa phương ở mỗi phương pháp và giá trị của chúng. Đó là, ít nhất, tìm địa chỉ và loại của chúng (số nguyên32/64/ký/unsigned, string, float, record, class ...) kết hợp có thể được sử dụng để tìm giá trị của chúng.

Đầu tiên là tiền phạt và đây là câu hỏi thứ hai mà câu hỏi này đề cập đến. Ở mức độ cao, làm thế nào để bạn liệt kê các biến cục bộ cho một mục nhập ngăn xếp trong Delphi?


Ở mức độ thấp, đây là những gì tôi đã và đang nghiên cứu:

RTTI: không liệt kê loại thông tin này về các phương pháp. Đây không phải là thứ mà tôi từng nghĩ là một lựa chọn thực tế, nhưng dù sao thì cũng liệt kê ở đây.

Thông tin gỡ lỗi: Tải thông tin gỡ lỗi được tạo cho bản dựng gỡ lỗi.

  • Tệp bản đồ: ngay cả tệp bản đồ chi tiết (tệp định dạng văn bản! Mở và xem) không chứa thông tin biến cục bộ. Về cơ bản nó là danh sách các địa chỉ và số dòng tệp nguồn. Tuyệt vời cho địa chỉ gửi tệp & tương quan dòng, ví dụ: các chấm màu xanh trong máng xối; không tuyệt vời để biết thông tin chi tiết hơn
  • Thông tin gỡ lỗi từ xa (tệp RSM) - no known information về nội dung hoặc định dạng của nó.
  • Tệp TD32/TDS: dòng nghiên cứu hiện tại của tôi. Chúng chứa các biểu tượng toàn cầu và địa phương trong số rất nhiều thông tin khác.

Những vấn đề tôi gặp phải ở đây là:

  • Không có tài liệu của các định dạng file TD32
  • Hầu hết kiến ​​thức của tôi trong số họ đến từ các Jedi JCL (mà tôi có thể tìm thấy.) mã bằng cách sử dụng chúng (JclTD32.pas) và tôi không chắc chắn làm thế nào để sử dụng mã đó, hoặc liệu các cấu trúc có đủ rộng để hiển thị các vars cục bộ. Tôi khá chắc chắn nó sẽ xử lý các biểu tượng toàn cầu, nhưng tôi rất không chắc chắn về địa phương. Có một loạt các hằng số được xác định và không có tài liệu cho định dạng, để đọc những gì họ có nghĩa là, tôi còn lại đoán. Tuy nhiên, những hằng số và tên của chúng phải đến từ đâu đó.
  • Source I can find using TDS info không tải hoặc xử lý các ký hiệu cục bộ.

Nếu đây là phương pháp phù hợp, thì câu hỏi này sẽ trở thành 'Tài liệu có định dạng tệp TDS/TD32 và có bất kỳ mẫu mã nào tải biến cục bộ không?'

Mẫu mã không cần thiết nhưng có thể rất hữu ích, ngay cả khi nó rất nhỏ.

+2

Tôi đã không thực sự sử dụng các đơn vị Jedi JCL để truy cập thông tin TD32 - Tôi có thư viện độc quyền của riêng tôi cho điều đó, nhưng nó trông giống như tất cả các hệ thống ống nước cơ bản bạn sẽ cần là có trong JclTD32.pas. Không có mã demo mà tôi có thể tìm thấy để truy cập thông tin biến, tuy nhiên, nhưng mẫu có ở đó (trong .. \ jcl \ examples \ windows \ debug \ sourceloc) cho biết cách lấy thông tin số dòng từ dữ liệu TD32, vì vậy bạn sẽ có thể xây dựng trên đó để có được những gì bạn cần. Xin vui lòng báo cáo lại ở đây những gì bạn tìm hiểu :) –

+2

@ 500-InternalServerError Cảm ơn. Thông tin về số dòng là dễ dàng (ngay cả trong các tệp bản đồ) - nhưng bạn có thể cung cấp bất kỳ thông tin nào về những gì bạn thấy trong mã JCL có liên quan cụ thể đến các biểu tượng địa phương không? Ngoài ra, ngoài tò mò, thư viện độc quyền TD32 của bạn là gì, và nó có được xuất bản/công khai có thể sử dụng hoặc chỉ trong nội bộ không? –

+3

Mỗi biểu tượng thủ tục/chức năng/phương pháp theo nó lần lượt chứa một danh sách các biểu tượng địa phương với nó. Hầu hết các định nghĩa đều xuất hiện ở đó trong đơn vị Jedi, nhưng một số có nhận xét. Đề nghị của tôi sẽ là tạo ra các ứng dụng thử nghiệm nhỏ và xem xét những gì đếm được các ký hiệu trả về. Mã tôi có là độc quyền và không phải để tôi xuất bản. Nó không bao gồm chủ đề của các biến cục bộ. Nhưng thông tin dựa trên nó là bán công khai, vì vậy tôi có thể giúp đỡ nếu bạn chạy vào các bức tường cụ thể. –

Trả lời

2

Kiểm tra xem có bất kỳ biểu tượng gỡ lỗi nào không ở dạng nhị phân hay không. Cũng có thể là sử dụng GDB (trên Windows một cổng nó). Sẽ rất tuyệt nếu bạn tìm thấy tệp .dbg hoặc .dSYM . Chúng chứa mã nguồn, ví dụ.

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 } 

Nếu bạn không có bất kỳ tập tin gỡ lỗi, bạn có thể thử để có được MinGW hoặc Cygwin, và sử dụng nm (1) (man page). Nó sẽ đọc tên biểu tượng từ nhị phân. Chúng có thể chứa một số loại, như những C++:

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

Đừng quên để thêm --demangle tùy chọn sau đó hoặc bạn sẽ nhận được một cái gì đó như:

__ZN11MRasterFont21getRasterForCharacterEh 

thay vì:

MRasterFont::getRasterForCharacter(unsigned char) 
+1

Jakub, cảm ơn câu trả lời. Thật không may tôi có lẽ cần phải đọc một định dạng gỡ lỗi cụ thể - TDS. Các ứng dụng Delphi không được biên dịch với thông tin gỡ rối tương thích GDB trên Windows. Tôi không chắc chắn như thế nào nm sẽ giúp một trong hai, vì nó sẽ dựa trên một định dạng tập tin gỡ lỗi cụ thể mà có lẽ không phải là một mà Delphi tạo ra. Hay tôi đã hiểu lầm câu trả lời của bạn - ví dụ GDB có thể đọc các biểu tượng của Delphi không? –

+0

@DavidM, nhận xét của bạn rất quan trọng. Hãy thử tìm cổng GNU Binutils hoặc GNU Debugger trên Windows (tôi chỉ biết cổng Binutils). Có một thư viện BFD cho GDB. Nó cũng được sử dụng trong Binutils. Nó cho phép đọc nhiều định dạng tập tin và nhận ra chúng bằng số ma thuật của chúng. Nếu mọi thứ thất bại, hãy sử dụng công cụ gọi là 'chuỗi'. Nó sẽ trích xuất các chuỗi từ bất kỳ tệp nhị phân nào. Xem [man page] (http://linux.die.net/man/1/strings). Thao tác này sẽ in các chuỗi ** có thể ** nhưng không phải hữu ích –

Các vấn đề liên quan