Saya ingin dapat men-debug membangun biner builder. Saat ini saya pada dasarnya mencetak data input ke parser biner, dan kemudian masuk ke dalam kode dan mencetak pemetaan input ke output, kemudian mengambil pemetaan output (bilangan bulat) dan menggunakannya untuk mencari bilangan bulat yang sesuai dalam biner. Cukup kikuk, dan mengharuskan saya memodifikasi kode sumber secara mendalam untuk mendapatkan pemetaan antara input dan output.
Sepertinya Anda bisa melihat biner dalam varian yang berbeda (dalam kasus saya, saya ingin melihatnya dalam potongan 8-bit sebagai angka desimal, karena itu cukup dekat dengan input). Sebenarnya, beberapa angka adalah 16 bit, beberapa 8, beberapa 32, dll. Jadi mungkin akan ada cara untuk melihat biner dengan masing-masing angka yang berbeda ini disorot dalam memori dalam beberapa cara.
Satu-satunya cara saya bisa melihat bahwa menjadi mungkin adalah jika Anda benar-benar membangun visualizer khusus untuk format / tata letak biner yang sebenarnya. Jadi ia tahu di mana dalam urutan angka 32 bit seharusnya, dan di mana angka 8 bit seharusnya, dll. Ini adalah banyak pekerjaan dan agak sulit dalam beberapa situasi. Jadi bertanya-tanya apakah ada cara umum untuk melakukannya.
Saya juga bertanya-tanya apa cara umum men-debug jenis hal ini saat ini, jadi mungkin saya bisa mendapatkan beberapa ide tentang apa yang harus dicoba dari itu.
Jawaban:
Untuk pemeriksaan ad-hoc, cukup gunakan hexdump standar dan pelajari cara melihatnya.
Jika Anda ingin alat untuk penyelidikan yang tepat, saya biasanya menulis dekoder terpisah dalam sesuatu seperti Python - idealnya ini akan didorong langsung dari dokumen spesifikasi pesan atau IDL, dan seotomatis mungkin (sehingga tidak ada kemungkinan memperkenalkan secara manual bug yang sama di kedua decoder).
Terakhir, jangan lupa Anda harus menulis unit test untuk decoder Anda, menggunakan input kalengan yang diketahui benar.
sumber
Langkah pertama untuk melakukan ini adalah bahwa Anda memerlukan cara untuk menemukan atau mendefinisikan tata bahasa yang menggambarkan struktur data yaitu skema.
Contohnya adalah fitur bahasa COBOL yang secara informal dikenal sebagai copybook. Dalam program COBOL Anda akan menentukan struktur data dalam memori. Struktur ini dipetakan langsung ke cara byte disimpan. Ini umum untuk bahasa pada zaman itu yang bertentangan dengan bahasa kontemporer umum di mana tata letak fisik memori merupakan masalah implementasi yang disarikan dari pengembang.
Pencarian google untuk bahasa skema data biner menghasilkan sejumlah alat. Contohnya adalah Apache DFDL . Mungkin sudah ada UI untuk ini juga.
sumber
ASN.1 , Abstract Syntax Notation One, menyediakan cara menentukan format biner.
sumber
Jawaban lain telah menjelaskan melihat hex dump, atau menuliskan struktur objek dalam JSON. Saya pikir menggabungkan keduanya sangat membantu.
Menggunakan alat yang dapat membuat JSON di atas hex dump sangat berguna; Saya menulis alat open source yang mengurai biner .NET yang disebut dotNetBytes , berikut ini adalah contoh contoh DLL .
sumber
Saya tidak yakin saya mengerti sepenuhnya, tetapi sepertinya Anda memiliki parser untuk format biner ini, dan Anda mengontrol kode untuk itu. Jadi jawaban ini dibangun di atas asumsi itu.
Pengurai dalam beberapa cara akan mengisi struct, kelas, atau struktur data apa pun yang dimiliki bahasa Anda. Jika Anda menerapkan a
ToString
untuk semua yang diurai, maka Anda berakhir dengan metode yang sangat mudah digunakan dan mudah dipelihara menampilkan data biner dalam format yang dapat dibaca manusia.Anda pada dasarnya akan memiliki:
Dan itu saja, dari sudut pandang menggunakannya. Tentu saja ini mengharuskan Anda mengimplementasikan / menimpa
ToString
fungsi untukObject
kelas / struct / apa pun Anda, dan Anda juga harus melakukannya untuk setiap kelas / struct / nate yang bersarang.Anda juga dapat menggunakan pernyataan bersyarat untuk mencegah
ToString
fungsi dipanggil dalam kode rilis sehingga Anda tidak membuang waktu untuk sesuatu yang tidak akan dicatat di luar mode debug.Anda
ToString
mungkin terlihat seperti ini:Pertanyaan awal Anda membuatnya terdengar seolah-olah Anda agak berusaha melakukan ini, dan Anda merasa metode ini memberatkan, tetapi Anda juga pada beberapa titik telah mengimplementasikan parsing format biner dan membuat variabel untuk menyimpan data itu. Jadi yang harus Anda lakukan adalah mencetak variabel-variabel yang ada pada tingkat abstraksi yang sesuai (kelas / struct variabel berada).
Ini adalah sesuatu yang harus Anda lakukan sekali saja, dan Anda bisa melakukannya sambil membangun parser. Dan itu hanya akan berubah ketika format biner berubah (yang sudah akan meminta perubahan ke parser Anda).
Dalam nada yang sama: beberapa bahasa memiliki fitur yang kuat untuk mengubah kelas menjadi XML atau JSON. C # sangat pandai dalam hal ini. Anda tidak harus menyerahkan format biner Anda, cukup lakukan XML atau JSON dalam pernyataan debug logging dan biarkan kode rilis Anda sendiri.
Saya pribadi merekomendasikan untuk tidak menggunakan hex dump route, karena rawan kesalahan (apakah Anda memulai pada byte yang tepat, apakah Anda yakin ketika Anda membaca dari kiri ke kanan bahwa Anda "melihat" endianness yang benar, dll.) .
Contoh: Katakan
ToStrings
variabel meludah Andaa,b,c,d,e,f,g,h
. Anda menjalankan program dan melihat adanya bugg
, tetapi masalahnya benar-benar dimulaic
(tetapi Anda sedang melakukan debug, jadi Anda belum mengetahuinya). Jika Anda tahu nilai input (dan Anda harus) Anda akan langsung melihat dic
situlah masalah dimulai.Dibandingkan dengan hex dump yang hanya memberitahu Anda
338E 8455 0000 FF76 0000 E444 ....
; jika bidang Anda memiliki ukuran yang bervariasi, di manac
dimulai dan apa nilainya - editor hex akan memberi tahu Anda, tetapi poin saya adalah ini rawan kesalahan dan memakan waktu. Tidak hanya itu, tetapi Anda tidak dapat dengan mudah / cepat mengotomatiskan pengujian melalui penampil hex. Mencetak string setelah mem-parsing data akan memberi tahu Anda dengan tepat apa yang 'dipikirkan' program Anda, dan akan menjadi satu langkah di sepanjang jalur pengujian otomatis.sumber