Program-assigned thread names on Windows
Commit Message
On 02.08.2016 17:55, Eli Zaretskii wrote:
>> From: LRN
>> Date: Tue, 2 Aug 2016 12:46:47 +0300
>>
>> So, what happens now?
>
> If no one objects in a while, we push.
>
No one seems to object.
I've attached the version of the patch with the named_thread == NULL issue
fixed, and also the ChangeLog and NEWS patches just for the hell of it.
@@ -174,6 +174,15 @@ static int debug_registers_used;
static int windows_initialization_done;
#define DR6_CLEAR_VALUE 0xffff0ff0
+#define MS_VC_EXCEPTION 0x406D1388
+
+typedef enum
+{
+ HANDLE_EXCEPTION_UNHANDLED = 0,
+ HANDLE_EXCEPTION_HANDLED,
+ HANDLE_EXCEPTION_IGNORED
+} handle_exception_result;
+
/* The string sent by cygwin when it processes a signal.
FIXME: This should be in a cygwin include file. */
#ifndef _CYGWIN_SIGNAL_STRING
@@ -1031,10 +1040,11 @@ display_selectors (char * args, int from_tty)
host_address_to_string (\
current_event.u.Exception.ExceptionRecord.ExceptionAddress))
-static int
+static handle_exception_result
handle_exception (struct target_waitstatus *ourstatus)
{
DWORD code = current_event.u.Exception.ExceptionRecord.ExceptionCode;
+ handle_exception_result result = HANDLE_EXCEPTION_HANDLED;
ourstatus->kind = TARGET_WAITKIND_STOPPED;
@@ -1064,7 +1074,7 @@ handle_exception (struct target_waitstatus *ourstatus)
&& addr < cygwin_load_end))
|| (find_pc_partial_function (addr, &fn, NULL, NULL)
&& startswith (fn, "KERNEL32!IsBad")))
- return 0;
+ return HANDLE_EXCEPTION_UNHANDLED;
}
#endif
break;
@@ -1140,10 +1150,52 @@ handle_exception (struct target_waitstatus *ourstatus)
DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_NONCONTINUABLE_EXCEPTION");
ourstatus->value.sig = GDB_SIGNAL_ILL;
break;
+ case MS_VC_EXCEPTION:
+ if (current_event.u.Exception.ExceptionRecord.NumberParameters >= 3
+ && (current_event.u.Exception.ExceptionRecord.ExceptionInformation[0] & 0xFFFFFFFF) == 0x1000)
+ {
+ long named_thread_id;
+ ptid_t named_thread_ptid;
+ struct thread_info *named_thread;
+ CORE_ADDR thread_name_target;
+ char *thread_name;
+ int thread_name_len;
+
+ DEBUG_EXCEPTION_SIMPLE ("MS_VC_EXCEPTION");
+
+ named_thread_id = (long) (0xFFFFFFFF & current_event.u.Exception.ExceptionRecord.ExceptionInformation[2]);
+ thread_name_target = current_event.u.Exception.ExceptionRecord.ExceptionInformation[1];
+
+ if (named_thread_id == (DWORD) -1)
+ named_thread_id = current_event.dwThreadId;
+
+ named_thread_ptid = ptid_build (current_event.dwProcessId, 0, named_thread_id),
+ named_thread = find_thread_ptid (named_thread_ptid);
+
+ thread_name = NULL;
+ thread_name_len = target_read_string (thread_name_target, &thread_name, 1025, 0);
+ if (thread_name_len > 0 && thread_name != NULL)
+ {
+ thread_name[thread_name_len - 1] = '\0';
+ if (thread_name[0] != '\0' && named_thread != NULL)
+ {
+ xfree (named_thread->name);
+ named_thread->name = thread_name;
+ }
+ else
+ {
+ xfree (thread_name);
+ }
+ }
+ ourstatus->value.sig = GDB_SIGNAL_TRAP;
+ result = HANDLE_EXCEPTION_IGNORED;
+ break;
+ }
+ /* treat improperly formed exception as unknown, fallthrough */
default:
/* Treat unhandled first chance exceptions specially. */
if (current_event.u.Exception.dwFirstChance)
- return 0;
+ return HANDLE_EXCEPTION_UNHANDLED;
printf_unfiltered ("gdb: unknown target exception 0x%08x at %s\n",
(unsigned) current_event.u.Exception.ExceptionRecord.ExceptionCode,
host_address_to_string (
@@ -1153,7 +1205,7 @@ handle_exception (struct target_waitstatus *ourstatus)
}
exception_count++;
last_sig = ourstatus->value.sig;
- return 1;
+ return result;
}
/* Resume thread specified by ID, or all artificially suspended
@@ -1510,10 +1562,19 @@ get_windows_debug_event (struct target_ops *ops,
"EXCEPTION_DEBUG_EVENT"));
if (saw_create != 1)
break;
- if (handle_exception (ourstatus))
- thread_id = current_event.dwThreadId;
- else
- continue_status = DBG_EXCEPTION_NOT_HANDLED;
+ switch (handle_exception (ourstatus))
+ {
+ case HANDLE_EXCEPTION_UNHANDLED:
+ default:
+ continue_status = DBG_EXCEPTION_NOT_HANDLED;
+ break;
+ case HANDLE_EXCEPTION_HANDLED:
+ thread_id = current_event.dwThreadId;
+ break;
+ case HANDLE_EXCEPTION_IGNORED:
+ continue_status = DBG_CONTINUE;
+ break;
+ }
break;
case OUTPUT_DEBUG_STRING_EVENT: /* Message from the kernel. */