Auto merge of #97191 - wesleywiser:main_thread_name, r=ChrisDenton
Call the OS function to set the main thread's name on program init Normally, `Thread::spawn` takes care of setting the thread's name, if one was provided, but since the main thread wasn't created by calling `Thread::spawn`, we need to call that function in `std::rt::init`. This is mainly useful for system tools like debuggers and profilers which might show the thread name to a user. Prior to these changes, gdb and WinDbg would show all thread names except the main thread's name to a user. I've validated that this patch resolves the issue for both debuggers.
This commit is contained in:
commit
4e725bad73
@ -1,5 +1,6 @@
|
|||||||
#![allow(missing_docs, nonstandard_style)]
|
#![allow(missing_docs, nonstandard_style)]
|
||||||
|
|
||||||
|
use crate::ffi::CStr;
|
||||||
use crate::io::ErrorKind;
|
use crate::io::ErrorKind;
|
||||||
|
|
||||||
pub use self::rand::hashmap_random_keys;
|
pub use self::rand::hashmap_random_keys;
|
||||||
@ -66,6 +67,15 @@ pub unsafe fn init(argc: isize, argv: *const *const u8) {
|
|||||||
stack_overflow::init();
|
stack_overflow::init();
|
||||||
args::init(argc, argv);
|
args::init(argc, argv);
|
||||||
|
|
||||||
|
// Normally, `thread::spawn` will call `Thread::set_name` but since this thread
|
||||||
|
// already exists, we have to call it ourselves. We only do this on macos
|
||||||
|
// because some unix-like operating systems such as Linux share process-id and
|
||||||
|
// thread-id for the main thread and so renaming the main thread will rename the
|
||||||
|
// process and we only want to enable this on platforms we've tested.
|
||||||
|
if cfg!(target_os = "macos") {
|
||||||
|
thread::Thread::set_name(&CStr::from_bytes_with_nul_unchecked(b"main\0"));
|
||||||
|
}
|
||||||
|
|
||||||
unsafe fn sanitize_standard_fds() {
|
unsafe fn sanitize_standard_fds() {
|
||||||
#[cfg(not(miri))]
|
#[cfg(not(miri))]
|
||||||
// The standard fds are always available in Miri.
|
// The standard fds are always available in Miri.
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#![allow(missing_docs, nonstandard_style)]
|
#![allow(missing_docs, nonstandard_style)]
|
||||||
|
|
||||||
use crate::ffi::{OsStr, OsString};
|
use crate::ffi::{CStr, OsStr, OsString};
|
||||||
use crate::io::ErrorKind;
|
use crate::io::ErrorKind;
|
||||||
use crate::os::windows::ffi::{OsStrExt, OsStringExt};
|
use crate::os::windows::ffi::{OsStrExt, OsStringExt};
|
||||||
use crate::path::PathBuf;
|
use crate::path::PathBuf;
|
||||||
@ -49,6 +49,10 @@
|
|||||||
// NOTE: this is not guaranteed to run, for example when Rust code is called externally.
|
// NOTE: this is not guaranteed to run, for example when Rust code is called externally.
|
||||||
pub unsafe fn init(_argc: isize, _argv: *const *const u8) {
|
pub unsafe fn init(_argc: isize, _argv: *const *const u8) {
|
||||||
stack_overflow::init();
|
stack_overflow::init();
|
||||||
|
|
||||||
|
// Normally, `thread::spawn` will call `Thread::set_name` but since this thread already
|
||||||
|
// exists, we have to call it ourselves.
|
||||||
|
thread::Thread::set_name(&CStr::from_bytes_with_nul_unchecked(b"main\0"));
|
||||||
}
|
}
|
||||||
|
|
||||||
// SAFETY: must be called only once during runtime cleanup.
|
// SAFETY: must be called only once during runtime cleanup.
|
||||||
|
51
src/test/debuginfo/thread-names.rs
Normal file
51
src/test/debuginfo/thread-names.rs
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
// compile-flags:-g
|
||||||
|
// We can't set the main thread name on Linux because it renames the process (#97191)
|
||||||
|
// ignore-linux
|
||||||
|
// ignore-android
|
||||||
|
// ignore-dragonfly
|
||||||
|
// ignore-emscripten
|
||||||
|
// ignore-freebsd
|
||||||
|
// ignore-haiku
|
||||||
|
// ignore-ios
|
||||||
|
// ignore-netbsd
|
||||||
|
// ignore-openbsd
|
||||||
|
// ignore-solaris
|
||||||
|
// ignore-sgx
|
||||||
|
// ignore-windows-gnu
|
||||||
|
|
||||||
|
// === GDB TESTS ==================================================================================
|
||||||
|
//
|
||||||
|
// gdb-command:run
|
||||||
|
//
|
||||||
|
// gdb-command:info threads
|
||||||
|
// gdb-check: 1 Thread [...] [...] "main" [...]
|
||||||
|
// gdb-check:* 2 Thread [...] [...] "my new thread" [...]
|
||||||
|
|
||||||
|
// === LLDB TESTS =================================================================================
|
||||||
|
//
|
||||||
|
// lldb-command:run
|
||||||
|
//
|
||||||
|
// lldb-command:thread info 1
|
||||||
|
// lldb-check:thread #1:[...]name = 'main'[...]
|
||||||
|
// lldb-command:thread info 2
|
||||||
|
// lldb-check:thread #2:[...]name = 'my new thread'[...]
|
||||||
|
|
||||||
|
// === CDB TESTS ==================================================================================
|
||||||
|
//
|
||||||
|
// cdb-command:g
|
||||||
|
//
|
||||||
|
// cdb-command:~
|
||||||
|
// cdb-check: 0 Id: [...] Suspend: 1 Teb: [...] Unfrozen "main"
|
||||||
|
// cdb-check:. [...] Id: [...] Suspend: 1 Teb: [...] Unfrozen "my new thread"
|
||||||
|
|
||||||
|
use std::thread;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let handle = thread::Builder::new().name("my new thread".into()).spawn(|| {
|
||||||
|
zzz(); // #break
|
||||||
|
}).unwrap();
|
||||||
|
|
||||||
|
handle.join().unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn zzz() {}
|
Loading…
Reference in New Issue
Block a user