diff options
author | Kevin Buettner <kevinb@redhat.com> | 2019-07-25 18:27:20 -0700 |
---|---|---|
committer | Kevin Buettner <kevinb@redhat.com> | 2019-07-27 13:52:45 -0700 |
commit | 6bdfee81576aae55666a9245cfc0a316a6849957 (patch) | |
tree | a472cdee9d0fea740162bbdf95b5e0b9dde859de /gdb/linux-thread-db.c | |
parent | 98a617f8d5cf9bfb53b2e1d5cf3f0e0f188d9e53 (diff) | |
download | gdb-6bdfee81576aae55666a9245cfc0a316a6849957.zip gdb-6bdfee81576aae55666a9245cfc0a316a6849957.tar.gz gdb-6bdfee81576aae55666a9245cfc0a316a6849957.tar.bz2 |
Fix gdb.python/py-thrhandle.exp failures for -m32 multilib
This patch fixes the following failures when testing with
"target_board unix/-m32" using a x86_64-pc-linux-gnu native GDB.
FAIL: gdb.python/py-thrhandle.exp: print thread for bogus handle thrs[3]
FAIL: gdb.python/py-thrhandle.exp: print thread for bogus handle thrs[4]
FAIL: gdb.python/py-thrhandle.exp: print thread id for thrs[0]
FAIL: gdb.python/py-thrhandle.exp: print thread id for thrs[1]
FAIL: gdb.python/py-thrhandle.exp: print thread id for thrs[2]
FAIL: gdb.python/py-thrhandle.exp: thread 0: fetch thread handle from thread
FAIL: gdb.python/py-thrhandle.exp: thread 0: verify that handles are the same
FAIL: gdb.python/py-thrhandle.exp: thread 1: fetch thread handle from thread
FAIL: gdb.python/py-thrhandle.exp: thread 1: verify that handles are the same
FAIL: gdb.python/py-thrhandle.exp: thread 2: fetch thread handle from thread
FAIL: gdb.python/py-thrhandle.exp: thread 2: verify that handles are the same
I've written it so that it might work for other 64-bit host / 32-bit target
combos too.
gdb/ChangeLog:
* linux-thread-db.c (thread_db_target::thread_handle_to_thread_info):
Add case for debugging 32-bit target on 64-bit host. Revise
comment.
Diffstat (limited to 'gdb/linux-thread-db.c')
-rw-r--r-- | gdb/linux-thread-db.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/gdb/linux-thread-db.c b/gdb/linux-thread-db.c index 950be9c..1d32e91 100644 --- a/gdb/linux-thread-db.c +++ b/gdb/linux-thread-db.c @@ -1672,16 +1672,21 @@ thread_db_target::thread_handle_to_thread_info (const gdb_byte *thread_handle, { thread_t handle_tid; - /* Thread handle sizes must match in order to proceed. We don't use an - assert here because the resulting internal error will cause GDB to - exit. This isn't necessarily an internal error due to the possibility - of garbage being passed as the thread handle via the python interface. */ - if (handle_len != sizeof (handle_tid)) + /* When debugging a 32-bit target from a 64-bit host, handle_len + will be 4 and sizeof (handle_tid) will be 8. This requires + a different cast than the more straightforward case where + the sizes are the same. + + Use "--target_board unix/-m32" from a native x86_64 linux build + to test the 32/64-bit case. */ + if (handle_len == 4 && sizeof (handle_tid) == 8) + handle_tid = (thread_t) * (const uint32_t *) thread_handle; + else if (handle_len == sizeof (handle_tid)) + handle_tid = * (const thread_t *) thread_handle; + else error (_("Thread handle size mismatch: %d vs %zu (from libthread_db)"), handle_len, sizeof (handle_tid)); - handle_tid = * (const thread_t *) thread_handle; - for (thread_info *tp : inf->non_exited_threads ()) { thread_db_thread_info *priv = get_thread_db_thread_info (tp); |