aboutsummaryrefslogtreecommitdiff
path: root/gdb/linux-thread-db.c
diff options
context:
space:
mode:
authorKevin Buettner <kevinb@redhat.com>2019-07-25 18:27:20 -0700
committerKevin Buettner <kevinb@redhat.com>2019-07-27 13:52:45 -0700
commit6bdfee81576aae55666a9245cfc0a316a6849957 (patch)
treea472cdee9d0fea740162bbdf95b5e0b9dde859de /gdb/linux-thread-db.c
parent98a617f8d5cf9bfb53b2e1d5cf3f0e0f188d9e53 (diff)
downloadgdb-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.c19
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);