Cita-cita saya adalah:
- Diberikan utas yang ditangguhkan dalam program Windows 32 atau 64-bit yang dikompilasi Delphi, untuk berjalan di tumpukan (dapat dilakukan)
- Diberikan entri tumpukan, untuk menghitung variabel lokal di setiap metode dan nilainya. Yaitu, paling tidak, temukan alamat dan jenisnya (integer32 / 64 / signed / unsigned, string, float, record, class ...) yang kombinasinya dapat digunakan untuk menemukan nilainya.
Yang pertama baik-baik saja dan yang kedua tentang pertanyaan ini. Pada tingkat tinggi, bagaimana Anda menghitung variabel lokal yang diberi entri tumpukan di Delphi?
Pada tingkat rendah, inilah yang telah saya selidiki:
RTTI: tidak mencantumkan informasi semacam ini tentang metode. Ini bukanlah sesuatu yang sebenarnya pernah saya anggap sebagai pilihan yang realistis, tetapi tetap mendaftar di sini.
Informasi debug: Memuat info debug yang dihasilkan untuk build debug.
- File peta: bahkan file peta terperinci (file format teks! Buka satu dan lihat) tidak berisi info variabel lokal. Ini pada dasarnya adalah daftar alamat dan nomor baris file sumber. Cocok untuk korelasi alamat ke file & baris, misalnya titik biru di selokan; tidak bagus untuk informasi yang lebih detail
- Informasi debugging jarak jauh (file RSM) - tidak ada informasi yang diketahui tentang konten atau formatnya.
- File TD32 / TDS: penelitian saya saat ini. Mereka mengandung simbol global dan lokal di antara banyak informasi lainnya.
Masalah yang saya hadapi di sini adalah:
- Tidak ada dokumentasi format file TD32 (yang dapat saya temukan.)
- Sebagian besar pengetahuan saya tentang mereka berasal dari kode Jedi JCL yang menggunakannya (JclTD32.pas) dan saya tidak yakin bagaimana menggunakan kode itu, atau apakah struktur di sana cukup luas untuk menampilkan vars lokal. Saya cukup yakin ini akan menangani simbol global, tetapi saya sangat tidak yakin tentang lokal. Ada berbagai macam konstanta yang ditentukan dan tanpa dokumentasi untuk formatnya, untuk membaca apa artinya, saya masih menebak-nebak. Namun, konstanta tersebut dan namanya pasti berasal dari suatu tempat.
- Sumber yang dapat saya temukan menggunakan info TDS tidak memuat atau menangani simbol lokal.
Jika ini adalah pendekatan yang benar, maka pertanyaan ini menjadi 'Apakah ada dokumentasi untuk format file TDS / TD32, dan apakah ada contoh kode yang memuat variabel lokal?'
Contoh kode tidak penting tetapi bisa sangat berguna, meskipun sangat minim.
Jawaban:
Periksa apakah simbol debugging tidak ada dalam biner. Juga mungkin menggunakan GDB (pada Windows port itu). Akan lebih bagus jika Anda menemukan file .dbg atau .dSYM. Mereka berisi kode sumber, mis.
Jika Anda tidak memiliki file debugging, Anda dapat mencoba untuk mendapatkan MinGW atau Cygwin, dan menggunakan nm (1) ( halaman manual ). Ini akan membaca nama simbol dari biner. Mereka mungkin berisi beberapa jenis, seperti C ++:
Jangan lupa untuk menambahkan
--demangle
opsi atau Anda akan mendapatkan sesuatu seperti:dari pada:
sumber
strings
. Ini akan mengekstrak string dari file biner apa pun. Lihat halaman manual . Ini akan mencetak string yang mungkin tetapi tidak harus bergunaLihat http://download.xskernel.org/docs/file%20formats/omf/borland.txt Open Architecture Handbook. Itu sudah lama, tetapi mungkin Anda menemukan beberapa informasi yang relevan tentang format file.
sumber