kernel: Add core dump facility
* Add function core_dump_write_core_file(). It writes a core file for the current thread's team. The file format is similar to that of other OSs (i.e. ELF with PT_LOAD segments and a PT_NOTE segment), but most of the notes are Haiku specific (infos for team, areas, images, threads). More data will probably need to be added. * Add team flag TEAM_FLAG_DUMP_CORE, thread flag THREAD_FLAGS_TRAP_FOR_CORE_DUMP, and Team property coreDumpCondition, a condition variable available while a core dump is progress. A thread that finds its flag THREAD_FLAGS_TRAP_FOR_CORE_DUMP set before exiting the kernel to userland calls core_dump_trap_thread(), which blocks on the condition variable until the core dump has finished. We need the team's threads to stop so we can get their CPU state (and have a generally unchanging team state while writing the core file). * Add user debugger message B_DEBUG_WRITE_CORE_FILE. It causes core_dump_write_core_file() to be called for the team. * Dumping core as an immediate effect of a terminal signal has not been implemented yet, but that should be fairly straight forward.
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2005, Ingo Weinhold, [email protected].
|
||||
* Copyright 2005-2016 Haiku, Inc. All rights reserved.
|
||||
* Distributed under the terms of the MIT License.
|
||||
*/
|
||||
#ifndef _DEBUGGER_H
|
||||
@@ -163,7 +163,9 @@ typedef enum {
|
||||
// install_team_debugger()
|
||||
|
||||
B_DEBUG_START_PROFILER, // start/stop sampling
|
||||
B_DEBUG_STOP_PROFILER //
|
||||
B_DEBUG_STOP_PROFILER, //
|
||||
|
||||
B_DEBUG_WRITE_CORE_FILE // write a core file
|
||||
} debug_nub_message;
|
||||
|
||||
// messages sent to the debugger
|
||||
@@ -412,6 +414,20 @@ typedef struct {
|
||||
thread_id thread; // thread to profile
|
||||
} debug_nub_stop_profiler;
|
||||
|
||||
// B_DEBUG_WRITE_CORE_FILE
|
||||
|
||||
typedef struct {
|
||||
port_id reply_port; // port to send the reply to
|
||||
char path[B_PATH_NAME_LENGTH];
|
||||
// path of the core file; must not exist
|
||||
// yet; must be absolute
|
||||
} debug_nub_write_core_file;
|
||||
|
||||
typedef struct {
|
||||
status_t error; // B_OK on success
|
||||
} debug_nub_write_core_file_reply;
|
||||
|
||||
|
||||
// reply is debug_profiler_update
|
||||
|
||||
// union of all messages structures sent to the debug nub thread
|
||||
@@ -433,6 +449,7 @@ typedef union {
|
||||
debug_nub_get_signal_handler get_signal_handler;
|
||||
debug_nub_start_profiler start_profiler;
|
||||
debug_nub_stop_profiler stop_profiler;
|
||||
debug_nub_write_core_file write_core_file;
|
||||
} debug_nub_message_data;
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user