Ketika saya pertama kali mencabut debugger USB dan kemudian mencoba mengeluarkan perintah melalui GDB, st-util memberikan kesalahan berikut dengan sangat cepat:
core status: unknown
[!] send_recv send request failed: LIBUSB_ERROR_NO_DEVICE
[!] send_recv STLINK_DEBUG_GETSTATUS
core status: unknown
[!] send_recv send request failed: LIBUSB_ERROR_NO_DEVICE
[!] send_recv STLINK_DEBUG_GETSTATUS
core status: unknown
[!] send_recv send request failed: LIBUSB_ERROR_NO_DEVICE
[!] send_recv STLINK_DEBUG_GETSTATUS
core status: unknown
[!] send_recv send request failed: LIBUSB_ERROR_NO_DEVICE
[!] send_recv STLINK_DEBUG_GETSTATUS
core status: unknown
2019-03-17T14:26:42 ERROR src/flash_loader.c: flash loader run error
2019-03-17T14:26:42 ERROR src/common.c: stlink_flash_loader_run(0x8000000) failed! == -1
sehingga menempati CPU hampir 100%. Ini menghasilkan pemborosan waktu yang serius (me-restart mesin virtual, dll.).
Jenis pesan kesalahan cukup normal. Namun, stutil
harus segera keluar dari kesalahan ini sehingga saya dapat menangani sisa masalah dengan memulai ulang stutil
atau mengambil tindakan lain.
Saya pikir stlink
harus dihentikan pada saat ini: https://github.com/texane/stlink/blob/df3c2b02867db03fb82f6faaad71300398965e85/src/usb.c#L54
Saya pikir
stlink
harus berakhir pada saat ini:https://github.com/texane/stlink/blob/df3c2b02867db03fb82f6faaad71300398965e85/src/usb.c#L54
Ya saya pikir Anda benar, panggilan ke libusb harus diperiksa sesuai. Jika mau, Anda dapat menambal dan mengirim PR. Itu juga harus dilakukan untuk panggilan lain ke libusb di file usb.c. Terima kasih telah melaporkan!
Jika mau, Anda dapat menambal dan mengirim PR.
Aku sangat ingin. Namun, saya tidak yakin bahwa saya memahami struktur proyek sehingga exit(1)
cukup di sini atau tidak.
Itu juga harus dilakukan untuk panggilan lain ke libusb di file usb.c.
Saya mungkin tidak memahami ini dengan baik. Maksud Anda " send_recv
membuat aplikasi berhenti di mana pun ia mengembalikan -1
"?
Saya telah menempatkan komentar di PR, ada lebih banyak tempat di mana itu bisa salah ketika panggilan dilakukan ke libusb.
Proyek ini diatur dengan cara berikut:
Saya pikir ini bisa terkait dengan #888 dan #445.
@ceremcem dan @rewolff : Bagaimana dengan ide membahas ini bersama?
@chenguokai : Apakah Anda punya ide tentang bagaimana melanjutkan di sini?
Tidak dapat mereproduksi kasus ini.
Saya mengikuti prosedur di mesin macOS saya. Pesan kesalahan muncul, tetapi tidak ada tanda-tanda memasuki loop mati.
Sunting: Saya mengeluarkan perintah n
setelah mengatur breakpoint pada fungsi main
dan mencabut st-link
Memang ada satu masalah bahwa program harus keluar daripada mencoba lagi mengirim atau menerima paket tanpa batas.
Panggilan fungsi ini tidak mengembalikan nilai yang tepat untuk mengakhiri loop while(1). Masalah mungkin terletak di dalam fungsi atau mekanisme while(1).
Setelah memeriksa proses penanganan kesalahan dengan lldb
, saya mungkin menemukan kode kesalahan.
Ketika _stlink_usb_step
menemukan kesalahan yang awalnya dipicu oleh kegagalan panggilan libusb, ia mengembalikan nilai pengembalian bukan nol (-1 dalam kasus ini). Namun nilai pengembalian ini tidak ditangani oleh loop recv-handle-send di gdb-server:
Saya datang dengan dua kemungkinan strategi kesepakatan:
Bagian umum: Periksa nilai kembalian stlink_step
dalam kasus sakelar.
Analisis:
Opsi 1 dapat diterima karena kami tidak dapat memprediksi apa yang akan terjadi setelah kesalahan komunikasi. Kekurangannya adalah st-util mungkin lebih sering gagal pada beberapa port usb yang tidak stabil atau yang serupa.
Opsi 2 akan memberikan kesempatan lain pada perangkat yang tidak stabil tetapi dapat menyebabkan duplikasi paket, yang membuat proses debug sedikit lebih tidak terduga.
Thx untuk analisis detailnya. Saya lebih suka opsi 1 di sini. Jika orang mengalami masalah yang terkait dengan ketidakstabilan perangkat keras lokal tertentu, tidak ada yang dapat kami lakukan untuk itu dan ini juga bukan hal yang harus dipertimbangkan oleh alat stlink. Tampaknya lebih penting bahwa kita melakukan kompromi pada debugging. Apakah Anda dapat langsung memperbaikinya?
Saya akan memeriksa dokumentasi gdb untuk mengirim paket dengan benar. Tidak terlalu sulit kurasa.
Setelah saya selesai, saya akan menaikkan PR.
Saya tidak mengatakannya, tetapi saya memilih opsi 2. Tapi setelah penjelasan Anda: Anda benar. Anda membuat saya yakin: Kecuali ada alasan yang sah untuk percaya bahwa kesalahan bersifat sementara, kesalahan harus segera dianggap fatal.
Mencoba kembali tanpa memberi tahu pengguna akan menyebabkan kejutan mendadak. Misalkan 1/100 atau 1/1000 bit yang ditransfer rusak (pada level apa pun). Jika itu menghasilkan perintah yang "tidak valid" dalam 99% dari waktu, pengguna dalam situasi itu rata-rata akan mendapatkan banyak peringatan (yaitu stlink tiba-tiba berhenti) bahwa perangkat kerasnya tidak stabil sebelum dia mendapatkan korupsi data diam yang menyebabkan masalah. ...
"Jalan keluar mudah" adalah dengan "keluar ()". Itu tiba-tiba akan menutup koneksi ke gdb dan itu akan menanganinya dengan cukup anggun.
Fungsi dasar berjalan dengan baik di bawah PR dengan papan stm32f401.
Loop mati diselesaikan selama pengujian lokal saya. Sekarang st-util akan keluar. gdb akan menerima balasan kegagalan dan memutuskan sambungan.