Nathan Froyd wrote: > When debugging multi-threaded programs, QEMU's gdb stub would report the > correct number of threads (the qfThreadInfo and qsThreadInfo packets). > However, the stub was unable to actually switch between threads (the T > packet), since it would report every thread except the first as being > dead. Furthermore, the stub relied upon cpu_index as a reliable means > of assigning IDs to the threads. This was a bad idea; if you have this > sequence of events: > > initial thread created > new thread #1 > new thread #2 > thread #1 exits > new thread #3 > > thread #3 will have the same cpu_index as thread #1, which would confuse > GDB. (This problem is partly due to the remote protocol not having a > good way to send thread creation/destruction events.) > > We fix this by using the host thread ID for the identifier passed to GDB > when debugging a multi-threaded userspace program. The thread ID might > wrap, but the same sort of problems with wrapping thread IDs would come > up with debugging programs natively, so this doesn't represent a > problem. > --- > cpu-defs.h | 1 + > exec.c | 2 +- > gdbstub.c | 69 +++++++++++++++++++++++++++++++------------------ > linux-user/syscall.c | 4 ++- > 4 files changed, 49 insertions(+), 27 deletions(-) > > Changes from earlier versions: use the host thread ID as the unique ID > to pass to GDB instead of inventing a new ID that tries to be robust > against wrapping. Looks good to me, has additionally some nice cleanup aspects, and survived a quick regression test in system mode. Jan