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


105

Mục tiêu của tôi là:

  • Đưa ra một chuỗi bị treo trong chương trình Windows 32 hoặc 64 bit do Delphi biên dịch, để đi bộ (có thể làm được)
  • Đưa ra các mục ngăn xếp, để liệt kê các biến cục bộ trong mỗi phương thức và giá trị của chúng. Đó là, ít nhất, hãy tìm địa chỉ và kiểu của chúng (số nguyên 32/64 / có dấu / không dấu, chuỗi, float, bản ghi, lớp ...) kết hợp chúng có thể được sử dụng để tìm giá trị của chúng.

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


Ở cấp độ thấp, đây là những gì tôi đang điều tra:

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à điều mà tôi thực sự từng nghĩ là một lựa chọn thực tế, nhưng dù sao cũng liệt kê ở đây.

Thông tin gỡ lỗi: Đang 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! Hãy mở một tệp và xem) không chứa thông tin biến địa phương. Về cơ bản, nó là một danh sách các địa chỉ và số dòng của tệp nguồn. Tuyệt vời cho địa chỉ để tệp & tương quan dòng, ví dụ: các chấm màu xanh lam trong rãnh nước; không tuyệt vời để biết thêm thông tin chi tiết
  • Thông tin gỡ lỗi từ xa (tệp RSM) - không có thông tin nào 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 ký hiệu toàn cầu và địa phương trong số rất nhiều thông tin khác.

Các vấn đề tôi gặp phải ở đây là:

  • Không có tài liệu về định dạng tệp TD32 (mà tôi có thể tìm thấy.)
  • Hầu hết kiến ​​thức của tôi về chúng đến từ mã Jedi JCL sử dụng chúng (JclTD32.pas) và tôi không chắc cách 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ộ hay không. Tôi khá chắc chắn rằng nó sẽ xử lý các ký hiệu toàn cầu, nhưng tôi rất không chắc chắn về địa phương. Có rất nhiều hằng số được định nghĩa và không có tài liệu cho định dạng, để đọc ý nghĩa của chúng, tôi chỉ đoán. Tuy nhiên, những hằng số đó và tên của chúng phải đến từ đâu đó.
  • Nguồn tôi có thể tìm bằng cách sử dụng thông tin TDS không tải hoặc xử lý các ký hiệu cục bộ.

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

Một 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 chưa 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 mình cho điều đó, nhưng có vẻ như tất cả các hệ thống ống nước cơ bản bạn sẽ cần đều có trong JclTD32.pas. Tuy nhiên, không có mã demo nào mà tôi có thể tìm thấy để truy cập thông tin biến, nhưng mẫu ở đó (trong .. \ jcl \amples \ windows \ debug \ chuaceloc) cho thấy 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 dựa trên đó để đạt được những gì bạn cần. Vui lòng báo cáo lại ở đây những gì bạn tìm thấy :)
500 - Lỗi máy chủ nội bộ

2
@ 500-InternalServerError Cảm ơn. Thông tin về số dòng rất 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 liên quan cụ thể đến các ký hiệu địa phương không? Ngoài ra, vì tò mò, thư viện độc quyền TD32 của bạn là gì và nó được xuất bản / sử dụng công khai hay chỉ trong nhà?
David

3
Mỗi biểu tượng thủ tục / hàm / phương thức dưới nó lần lượt chứa một danh sách các ký hiệu cục bộ của nó. Hầu hết các định nghĩa dường như có trong đơn vị Jedi, nhưng một số định nghĩa bị bỏ qua. Đề xuất của tôi sẽ là tạo các ứng dụng thử nghiệm nhỏ và xem một bảng liệt kê các ký hiệu trả về gì. 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 gặp phải những bức tường cụ thể.
500 - Lỗi máy chủ nội bộ

4
tds2pdb ( code.google.com/p/map2dbg ) dường như có trình phân tích cú pháp cho các tệp tds. Đó là mã C #.
Graymatter

4
Đã từng có một tài liệu không chính thức, vâng, nhưng sau đó Borland (vào thời điểm đó) đã quyết định phát hành một dll thay thế để truy cập thông tin gỡ lỗi để họ có thể thay đổi định dạng nội bộ và không phải cập nhật tài liệu. Thật không may, tôi không thể tìm thấy tài liệu gốc hoặc dll ngay bây giờ. Tôi khuyên bạn nên liên hệ với bộ phận hỗ trợ kỹ thuật của Embarcadero và hỏi về nó.
500 - Lỗi máy chủ nội bộ

Câu trả lời:


2

Kiểm tra xem có bất kỳ ký hiệu 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 của nó). Sẽ thậ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 gỡ lỗi nào, bạn có thể thử lấy MinGW hoặc Cygwin và sử dụng nm (1) ( trang người đàn ông ). Nó sẽ đọc tên ký hiệu từ hệ nhị phân. Chúng có thể chứa một số kiểu, như kiểu C ++:

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

Đừng quên thêm --demangletù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)

2
Jakub, cảm ơn vì 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. Ứng dụng Delphi không được biên dịch với thông tin gỡ lỗi tương thích với GDB trên Windows. Tôi không chắc nm sẽ giúp ích như thế nào, vì nó sẽ dựa trên một định dạng tệp gỡ lỗi cụ thể mà có thể không phải là định dạng mà Delphi tạo ra. Hay tôi đã hiểu sai câu trả lời của bạn - ví dụ như GDB có thể đọc các ký hiệu của Delphi không?
David

@DavidM, nhận xét của bạn rất quan trọng. Cố gắng tìm cổng của 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 và nhận ra chúng bằng những con số kỳ diệu của chúng. Nếu mọi thứ không thành công, hãy sử dụng công cụ được gọi là strings. Nó sẽ trích xuất các chuỗi từ bất kỳ tệp nhị phân nào. Xem trang người đàn ông . Điều này sẽ in ra các chuỗi có thể nhưng không cần thiết phải hữu ích
Top Sekret

0

Hãy xem http://download.xskernel.org/docs/file%20formats/omf/borland.txt Sổ tay Kiến trúc Mở. Nó đã cũ, nhưng có thể bạn tìm thấy một số thông tin liên quan về định dạng tệp.


Bạn có thể vui lòng thêm một số ngữ cảnh, liên kết có thể bị hỏng trong tương lai.
Hintham

Liên kết chứa tài liệu chính thức từ borland về định dạng tệp OMF được sử dụng bởi trình biên dịch Borland và các định dạng tệp nhị phân khác được Borland sử dụng. Vài năm trước, tôi đã xem xét định dạng tệp TDS và có vẻ như một số phần tương thích với các định dạng tệp tài liệu. Khi cố gắng thu thập bất kỳ thông tin nào về các biến cục bộ từ tệp TDS, tài liệu liên kết nên được sử dụng hoặc tham chiếu. Nếu liên kết bị hỏng, câu trả lời của tôi sẽ vô dụng và thông tin cần thiết sẽ bị mất. "Sổ tay Kiến trúc Mở" được liên kết là một phần của các bản phát hành Turbo Pascal và C cũ.
Muetze1
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.