GNU/Linux >> Belajar Linux >  >> Linux

RR - Rekam &putar ulang software debugger

Selama bertahun-tahun, saya telah menulis panjang lebar tentang cara memecahkan masalah terkait perangkat lunak di dunia TI secara umum, dan di Linux, pada khususnya. Bagaimanapun, ini telah menjadi roti &mentega saya untuk waktu yang lama, dan saya masih cukup tertarik pada seni pemecahan masalah. Salah satu topik yang banyak saya bahas adalah gdb, debugger perangkat lunak klasik. Satu-satunya masalah adalah - Anda harus memulai untuk menang.

Apa yang saya maksud dengan ini - gdb sangat bagus jika Anda dapat mereproduksi masalah Anda. Tetapi jika Anda menjalankan perangkat lunak dalam pengaturan produksi, Anda mungkin tidak memiliki kemewahan untuk terus memicu masalah berulang kali. Kemampuan untuk menangkap dan kemudian memutar ulang bug adalah aset yang bagus, dan itu datang dalam bentuk RR, alat yang dirancang untuk membantu men-debug eksekusi yang direkam dari perangkat lunak dengan cara yang tepat dan deterministik. Mari kita lihat apa yang memberi.

Siap, mantap, setel

Intinya, RR adalah gdb, dan gdb adalah RR. Idenya sederhana dan implementasinya elegan. Anda menjalankan alat Anda dengan rr, Anda menangkap eksekusi (dan kegagalan), dan kemudian Anda memutar ulang rekaman sebanyak yang Anda suka, jauh dari lingkungan produksi. Selain itu, jika ada masalah yang sulit dipahami, Anda mungkin dapat mengambil skenario yang dapat diulang, memungkinkan Anda untuk lebih cepat mengetahui akar masalah dan memperbaiki masalah.

Saya menginstal dan mengkonfigurasi RR di Fedora 32. Cukup mudah. Sekarang, eksekusi memang membutuhkan perhatian terhadap detail. Jika Anda menjalankan program sebagai pengguna biasa, Anda mungkin melihat peringatan bahwa RR tidak dapat benar-benar mengambil peristiwa kernel yang diistimewakan. Anda dapat mengubah ini, dan kemudian Anda tidak perlu sudo. Mirip dengan apa yang telah kita lihat dengan perf benar-benar. Manis.

rr record ./seg
rr membutuhkan /proc/sys/kernel/perf_event_paranoid <=1, tetapi 2.
Ubah ke 1, atau gunakan 'rr record -n' (lambat).
Pertimbangkan untuk meletakkan 'kernel.perf_event_paranoid =1' di /etc/sysctl.conf

Ada banyak cara Anda dapat mengubah ini. Cat nilai ke /proc, gunakan sysctl -w untuk menulis nilai, edit file /etc/sysctl.conf secara manual, lalu muat ulang konfigurasi. Apapun cara yang Anda pilih, Anda akan memiliki kinerja yang lebih baik, dan kemampuan untuk melacak semua peristiwa yang diperlukan.

sudo sysctl -w kernel.perf_event_paranoid=1

Contoh segfault

Untuk melihat betapa praktis dan bergunanya RR, saya memutuskan untuk menggunakan contoh segfault yang sama dari tutorial gdb. Pada dasarnya, loop dengan malloc() yang akan menyebabkan kesalahan segmentasi:

#include
#include

main()
{
int *pointer;
int i;
pointer =malloc(sizeof(int));
untuk (i =0; 1; i++)
{
pointer[i]=i;
printf("penunjuk[%d] =%d\n", i, penunjuk[i]);
}
return(0);
}

gcc -g seg.c -o seg
seg.c:4:1:warning:mengembalikan tipe default ke 'int' [-Wimplicit-int]
4 | utama()
| ^~~~~

Rekor RR &pemutaran ulang RR

Dua fungsi utama yang digunakan RR - rekam dan putar ulang.

rr record ./seg
...
pointer[33621] =33621
pointer[33622] =33622
pointer[33623] =33623
Kesalahan segmentasi (inti dibuang)

Harap dicatat bahwa eksekusi yang sebenarnya akan lebih lambat dari biasanya. Ini berarti bahwa jika Anda memiliki masalah yang bergantung pada waktu, RR mungkin tidak berguna. Sangat mirip dengan apa yang telah kita lihat dengan strace. Anda menginginkan masalah deterministik yang dapat direplikasi secara andal (dalam kondisi yang tepat).

Bagaimanapun, setelah masalah direkam, kami dapat memutar ulang:

rr putar ulang

Pertama kali RR dimuat, itu memperingatkan saya bahwa simbol debug tidak tersedia - ini cukup penting jika Anda benar-benar ingin dapat memecahkan masalah. Ini tidak spesifik untuk RR dengan cara apa pun, tetapi ini adalah sesuatu yang perlu dipertimbangkan - Anda dapat menginstal paket yang hilang jika Anda mau, program ini bahkan mencantumkan perintah persis yang dapat Anda gunakan untuk melakukannya.

Debug jarak jauh menggunakan 127.0.0.1:7747
Membaca simbol dari /lib64/ld-linux-x86-64.so.2...
(Tidak ada simbol debug yang ditemukan di /lib64/ld-linux-x86 -64.so.2)
0x00007f25ce73e110 di _start () dari /lib64/ld-linux-x86-64.so.2
Tidak ada debuginfo terpisah, gunakan:dnf debuginfo-install glibc-2.31-2 .fc32.x86_64--Ketik untuk lebih banyak, q untuk keluar, c untuk melanjutkan tanpa paging--

Setelah antarmuka RR dimuat, Anda berada di tanah gdb. Perintahnya sama. Anda dapat menyetel break point, lalu menggunakan kondisi kapan break point tersebut harus benar-benar diaktifkan dan eksekusi tugas dihentikan.

break 10
kondisi 1 i ==33610
lanjutkan

Dan sesi debug akan terlihat seperti:

(rr) next
pointer[33611] =33611
9 for (i =0; 1; i++)
(rr) next
11 pointer[i]=i;
(rr) next

Program menerima sinyal SIGSEGV, Kesalahan segmentasi.
0x000000000040116a di main () di seg.c:11
11 pointer[i]=i;

Sekarang, Anda bisa masuk lebih dalam, dan melakukan pemeriksaan tambahan. Perbedaan utamanya adalah bahwa semua ini terjadi pada instans yang direkam dari perangkat lunak Anda, sehingga Anda tidak berpotensi mengganggu penggunaan sebenarnya dari layanan dan aplikasi Anda. Idealnya, Anda memerlukan penyiapan cerdas yang dapat secara otomatis mendeteksi masalah dan merekamnya, tetapi itu adalah cerita yang berbeda sama sekali.

Kesimpulan

Saya tidak menghabiskan terlalu banyak waktu menggunakan RR, tetapi saya menyukai apa yang saya lihat. Program ini menggunakan dasar-dasar yang familier dan kuat dari gdb, yang berarti Anda tidak perlu mempelajari kembali pemecahan masalah Linux dari awal. Selain itu, ia menambahkan lapisan fleksibilitas yang kuat, memungkinkan Anda meminimalkan tekanan waktu yang sering dikaitkan dengan masalah TI - seperti kerusakan perangkat lunak. Anda dapat merekam dan memutar ulang sesuka Anda. Ini juga berarti Anda lebih mungkin menemukan masalah, terutama jika Anda berurusan dengan eksekusi tugas yang rumit dan lama.

Semoga tutorial singkat ini bermanfaat bagi Anda. Di dunia di mana ada sepuluh koki untuk setiap makanan, dan lima puluh alat Linux yang berlebihan untuk setiap kebutuhan, senang melihat perangkat lunak yang menawarkan fungsionalitas ekstra yang berarti daripada pengulangan dari yang lama. Nah, Anda sekarang memiliki utilitas lain di gudang senjata Anda, yang juga berarti satu alasan lebih sedikit untuk tidak dapat menyelesaikan masalah perangkat lunak sial itu dengan cukup cepat. Begitulah cara kerjanya, bukan.


Linux
  1. Pengantar editor vi

  2. Dasar-dasar perintah Linux:printf

  3. RR - Rekam &putar ulang software debugger

  1. Bagaimana cara merekam screencasts di GNOME 3

  2. Evolusi manajer paket

  3. perangkat lunak steganografi

  1. Cara menginstal perangkat lunak di RHEL 8

  2. Cara Merekam dan Memutar Ulang Sesi Terminal Linux menggunakan Perintah 'script' dan 'scriptreplay'

  3. Slackware 15 - Brigade lama