Stlink: st-util harus keluar pada LIBUSB_ERROR_NO_DEVICE

Dibuat pada 17 Mar 2019  ·  12Komentar  ·  Sumber: stlink-org/stlink

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.

bufixed componenst-util componenstlink-lib dependenclibusb errogdb-server staturesolved

Semua 12 komentar

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:

  • libstlink (usb.c adalah bagian darinya dan tidak boleh menggunakan exit di perpustakaan) file perpustakaan terletak di folder src, yang paling penting adalah usb.c dan common.c (dan tentu saja flash_loader.c)
  • st-util terletak di src/gdbserver
  • st-info terletak di src/tools/info.c
  • st-flash terletak di src/tools/flash.c

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.
image
image

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.

https://github.com/texane/stlink/blob/0082e48857907762627dba2cee54ffca64dad17/src/gdbserver/gdb-server.c#L1121

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.

https://github.com/texane/stlink/blob/bf840a1ae82ffc3ef9929f243bb8050d6856f698/src/gdbserver/gdb-server.c#L1448

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:

https://github.com/texane/stlink/blob/bf840a1ae82ffc3ef9929f243bb8050d6856f698/src/gdbserver/gdb-server.c#L1119

Saya datang dengan dua kemungkinan strategi kesepakatan:

Bagian umum: Periksa nilai kembalian stlink_step dalam kasus sakelar.

  1. Jika ada kesalahan, coba beri tahu GDB dan keluar.
  2. Ulangi panggilan fungsi ini untuk waktu terbatas, jika kegagalan tetap ada, beri tahu GDB dan keluar, jika tidak lanjutkan.

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.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat