Hatred's Log Place

DON'T PANIC!

Aug 25, 2017 - 3 minute read -

Qt Creator, Baremetal и связка GDB>=7.7.1+OpenOCD

Если коротко, то эта связка криво работает. Поймано на ARM GDB 8.0, но воспроизводится и на 7.12.1. При наличии на борту устройства какой-либо RTOS. У меня это ThreadX. Хотя, возможно, для других всё отработает нормально. Но это мало что меняет: на старом GDB 7.7.1 тот же OpenOCD работает.

Суть проблемы и способ её решения без вмешивания в код под катом.

Проблема в том, что при посылке команды -thread-info до -exec-continue (или просто continue) можно получить такой результат:

>=thread-exited,id="1",group-id="i1"
sThread 1 in group i1 exited
>=thread-created,id="2",group-id="i1"
sThread 2 created
>~"[New Thread 1074059044]<br/>n"
s[New Thread 1074059044]
>=thread-created,id="3",group-id="i1"
sThread 3 created
>~"[New Thread 1074055240]<br/>n"
s[New Thread 1074055240]
>=thread-created,id="4",group-id="i1"
sThread 4 created
>~"[New Thread 1074056128]<br/>n"
s[New Thread 1074056128]
>=thread-created,id="5",group-id="i1"
sThread 5 created
>~"[New Thread 1074057816]<br/>n"
s[New Thread 1074057816]
>=thread-created,id="6",group-id="i1"
sThread 6 created
>~"[New Thread 1074058064]<br/>n"
s[New Thread 1074058064]
>=thread-created,id="7",group-id="i1"
sThread 7 created
>~"[New Thread 1074055900]<br/>n"
s[New Thread 1074055900]
>=thread-created,id="8",group-id="i1"
sThread 8 created
>~"[New Thread 1074055692]<br/>n"
s[New Thread 1074055692]
>=thread-created,id="9",group-id="i1"
sThread 9 created
>~"[New Thread 1074057248]<br/>n"
s[New Thread 1074057248]
>=thread-created,id="10",group-id="i1"
sThread 10 created
>~"[New Thread 1074116952]<br/>n"
s[New Thread 1074116952]
>=thread-created,id="11",group-id="i1"
sThread 11 created
>~"[New Thread 1074119588]<br/>n"
s[New Thread 1074119588]
>=thread-created,id="12",group-id="i1"
sThread 12 created
>~"[New Thread 1074122076]<br/>n"
s[New Thread 1074122076]
>=thread-created,id="13",group-id="i1"
sThread 13 created
>~"[New Thread 1074123328]<br/>n"
s[New Thread 1074123328]
>=thread-created,id="14",group-id="i1"
sThread 14 created
>~"[New Thread 1074125312]<br/>n"
s[New Thread 1074125312]
>=thread-created,id="15",group-id="i1"
sThread 15 created
>~"[New Thread 1074132172]<br/>n"
s[New Thread 1074132172]
>=thread-created,id="16",group-id="i1"
sThread 16 created
>~"[New Thread 1074133428]<br/>n"
s[New Thread 1074133428]
>=thread-created,id="17",group-id="i1"
sThread 17 created
>~"[New Thread 1074137052]<br/>n"
s[New Thread 1074137052]
>=thread-created,id="18",group-id="i1"
sThread 18 created
>~"[New Thread 1074138308]<br/>n"
s[New Thread 1074138308]
>&"Info : thread: 0x4004d724, stack_ptr=0x4004db1c<br/>n"
>&"Info : thread: 0x4004c848, stack_ptr=0x40058bf4<br/>n"
>&"Info : thread: 0x4004cbc0, stack_ptr=0x40059044<br/>n"
>&"Info : thread: 0x4004d258, stack_ptr=0x40059834<br/>n"
>&"Info : thread: 0x4004d350, stack_ptr=0x40059a5c<br/>n"
>&"Info : thread: 0x4004cadc, stack_ptr=0x40059f0c<br/>n"
>&"Info : thread: 0x4004ca0c, stack_ptr=0x4005a394<br/>n"
>&"Info : thread: 0x4004d020, stack_ptr=0x4005a7ac<br/>n"
>&"Info : thread: 0x4005b958, stack_ptr=0x4005b814<br/>n"
>&"Info : thread: 0x4005c3a4, stack_ptr=0x4005c264<br/>n"
>&"Info : thread: 0x4005cd5c, stack_ptr=0x4005cc5c<br/>n"
>&"Info : thread: 0x4005d240, stack_ptr=0x4005d194<br/>n"
>&"Info : thread: 0x4005da00, stack_ptr=0x4005d944<br/>n"
>&"Info : thread: 0x4005f4cc, stack_ptr=0x4005f39c<br/>n"
>&"Info : thread: 0x4005f9b4, stack_ptr=0x4005f89c<br/>n"
>&"Info : thread: 0x400607dc, stack_ptr=0x400606a4<br/>n"
>&"Info : thread: 0x40060cc4, stack_ptr=0x40060ba4<br/>n"
>1712^done,threads=[{id="2",target-id="Thread 1074059044",details="Name: System Timer Thread, State: Suspended",frame={level="0",addr="0x00000000",func="??",args=[]},state="stopped"},{id="3",target-id="Thread 1074055240",details="Name: 01_DMA_THREAD, State: Waiting - Queue",frame={level="0",addr="0x00000000",func="??",args=[]},state="stopped"},{id="4",target-id="Thread 1074056128",details="Name: 02_SYSTEM_THREAD, State: Sleeping",frame={level="0",addr="0x00000000",func="??",args=[]},state="stopped"},{id="5",target-id="Thread 1074057816",details="Name: 06_SIB_THREAD, State: Waiting - Event flag",frame={level="0",addr="0x00000000",func="??",args=[]},state="stopped"},{id="6",target-id="Thread 1074058064",details="Name: 07_DEBUG_THREAD, State: Waiting - Queue",frame={level="0",addr="0x00000000",func="??",args=[]},state="stopped"},{id="7",target-id="Thread 1074055900",details="Name: 03_PIB_THREAD, State: Waiting - Event flag",frame={level="0",addr="0x00000000",func="??",args=[]},state="stopped"},{id="8",target-id="Thread 1074055692",details="Name: 05_LPP_THREAD, State: Waiting - Event flag",frame={level="0",addr="0x00000000",func="??",args=[]},state="stopped"},{id="9",target-id="Thread 1074057248",details="Name: 04_UIB_THREAD, State: Waiting - Event flag",frame={level="0",addr="0x00000000",func="??",args=[]},state="stopped"},{id="10",target-id="Thread 1074116952",details="Name: App main thread, State: Waiting - Queue",frame={level="0",addr="0x00000000",func="??",args=[]},state="stopped"},{id="11",target-id="Thread 1074119588",details="Name: KvmHidSlave, State: Waiting - Event flag",frame={level="0",addr="0x00000000",func="??",args=[]},state="stopped"},{id="12",target-id="Thread 1074122076",details="Name: Board thread, State: Waiting - Event flag",frame={level="0",addr="0x00000000",func="??",args=[]},state="stopped"},{id="13",target-id="Thread 1074123328",details="Name: LedThread, State: Sleeping",frame={level="0",addr="0x00000000",func="??",args=[]},state="stopped"},{id="14",target-id="Thread 1074125312",details="Name: AutoDetectInputThread, State: Sleeping",frame={level="0",addr="0x00000000",func="??",args=[]},state="stopped"},{id="15",target-id="Thread 1074132172",details="Name: StreamingStopThread, State: Waiting - Event flag",frame={level="0",addr="0x00000000",func="??",args=[]},state="stopped"},{id="16",target-id="Thread 1074133428",details="Name: KvmHidMaster, State: Waiting - Event flag",frame={level="0",addr="0x00000000",func="??",args=[]},state="stopped"},{id="17",target-id="Thread 1074137052",details="Name: FpgaUsbIsrThread, State: Waiting - Event flag",frame={level="0",addr="0x4002bce4",func="Mutex::lock",args=[{name="this",value="0x40060767"},{name="this@entry",value="0x40060767"}],file="/home/hatred/programming/work/Epiphan/fx3uvc-git/epilib/os/mutex.cpp",fullname="/home/hatred/programming/work/Epiphan/fx3uvc-git/epilib/os/mutex.cpp",line="24"},state="stopped"},{id="18",target-id="Thread 1074138308",details="Name: FpgaUsbThread, State: Waiting - Event flag",frame={level="0",addr="0x00000000",func="??",args=[]},state="stopped"}],current-thread-id="1"

После чего вызов -exec-continue будет завершён примерно следующим образом:

>1716^error,msg="Cannot execute this command without a live selected thread."

Проблема воспроизводима и без QtC, запуском GDB и OpenOCD вручную.

В чем суть? Если посмотрим внимательно на порятнку выше, то можно выделить главную часть:

>=thread-exited,id="1",group-id="i1"
sThread 1 in group i1 exited
...SKIPPED...
>1712^done,threads=[...SKIPPED...],current-thread-id="1"

Ага, именно! Поток с id равным 1 завершился, в выводе -thread-info его тоже нет (здесь я этот вывод убрал), но всё же он помечен, как текущий исполняемый!

Если же вызвать -thread-info ещё раз, то всё становится на свои места и остальные команды магическим образом “чинятся”.

Собственно это и есть WA: в настройках OpenOCD последней командой в “Init commands:” добавьте вызов info threads. Можно два раза. Что бы наверняка.

Похоже, где-то присутствует гонка, но лезть дальше и разбираться ни сил, ни времени нет.