Index: lib/sanitizer_common/sanitizer_printf.cc =================================================================== --- lib/sanitizer_common/sanitizer_printf.cc +++ lib/sanitizer_common/sanitizer_printf.cc @@ -260,7 +260,6 @@ "Buffer in Report is too short!\n"); \ } if (append_pid) { - int pid = internal_getpid(); const char *exe_name = GetProcessName(); if (common_flags()->log_exe_name && exe_name) { needed_length += internal_snprintf(buffer, buffer_size, @@ -269,7 +268,9 @@ } needed_length += internal_snprintf(buffer + needed_length, buffer_size - needed_length, - "==%d==", pid); + "==%d:%d==", + internal_getpid(), + GetTid()); CHECK_NEEDED_LENGTH } needed_length += VSNPrintf(buffer + needed_length, @@ -300,7 +301,7 @@ va_end(args); } -// Like Printf, but prints the current PID before the output string. +// Like Printf, but prints the current PID:TID before the output string. FORMAT(1, 2) void Report(const char *format, ...) { va_list args; Index: test/sanitizer_common/TestCases/Linux/vreport.cc =================================================================== --- /dev/null +++ test/sanitizer_common/TestCases/Linux/vreport.cc @@ -0,0 +1,23 @@ +// RUN: %clangxx -O0 %s -o %t && %env_tool_opts=verbosity=10 %run %t 2>&1 | FileCheck %s + +#include +#include +#include +#include + +void *thread(void *unused) { + printf("PID: %d\n", getpid()); + printf("TID: %ld\n", syscall(SYS_gettid)); + fflush(stdout); + return 0; +} + +int main() { + pthread_t t; + pthread_create(&t, 0, thread, 0); + pthread_join(t, 0); + return 0; +} +// CHECK: PID: [[PID:[0-9]+]] +// CHECK: TID: [[TID:[0-9]+]] +// CHECK: ==[[PID]]:[[TID]]==