* All "GUI servers" (app server, input server, and registrar) will now be

debugged automatically in a consoled session, when they crash. Note,
  that after a recoverable error (like a debugger() call) one can
  "detach" the debugged team in gdb, "quit", and continue as if
  nothing happened. 8-O
* The input server will no longer be killed when starting the debugger
  in a consoled session. Not sure why it was done; it simply works as it
  is now.
* Replaced all printf()s and fprintf()s by debug_printf() or TRACE(()).
  The debug server prints little enough anyway. In fact only when something
  crashes or an unexpected error occurs.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20145 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold 2007-02-16 17:03:34 +00:00
parent 7b95cc638b
commit 38979f27b0
1 changed files with 33 additions and 48 deletions

View File

@ -29,7 +29,7 @@
//#define TRACE_DEBUG_SERVER
#ifdef TRACE_DEBUG_SERVER
# define TRACE(x) printf x
# define TRACE(x) debug_printf x
#else
# define TRACE(x) ;
#endif
@ -54,15 +54,15 @@ KillTeam(team_id team, const char *appName = NULL)
if (!appName) {
status_t error = get_team_info(team, &info);
if (error != B_OK) {
printf("debug_server: KillTeam(): Error getting info for team %ld: "
"%s\n", team, strerror(error));
debug_printf("debug_server: KillTeam(): Error getting info for "
"team %ld: %s\n", team, strerror(error));
info.args[0] = '\0';
}
appName = info.args;
}
printf("debug_server: Killing team %ld (%s)\n", team, appName);
debug_printf("debug_server: Killing team %ld (%s)\n", team, appName);
kill_team(team);
}
@ -328,15 +328,15 @@ TeamDebugHandler::Init(port_id nubPort)
// get the team info for the team
status_t error = get_team_info(fTeam, &fTeamInfo);
if (error != B_OK) {
printf("debug_server: TeamDebugHandler::Init(): Failed to get info "
"for team %ld: %s\n", fTeam, strerror(error));
debug_printf("debug_server: TeamDebugHandler::Init(): Failed to get "
"info for team %ld: %s\n", fTeam, strerror(error));
return error;
}
// get the executable path
error = BPrivate::get_app_path(fTeam, fExecutablePath);
if (error != B_OK) {
printf("debug_server: TeamDebugHandler::Init(): Failed to get "
debug_printf("debug_server: TeamDebugHandler::Init(): Failed to get "
"executable path of team %ld: %s\n", fTeam, strerror(error));
fExecutablePath[0] = '\0';
@ -345,7 +345,7 @@ TeamDebugHandler::Init(port_id nubPort)
// init a debug context for the handler
error = init_debug_context(&fDebugContext, fTeam, nubPort);
if (error != B_OK) {
printf("debug_server: TeamDebugHandler::Init(): Failed to init "
debug_printf("debug_server: TeamDebugHandler::Init(): Failed to init "
"debug context for team %ld, port %ld: %s\n", fTeam, nubPort,
strerror(error));
return error;
@ -356,7 +356,7 @@ TeamDebugHandler::Init(port_id nubPort)
snprintf(name, sizeof(name), "team %ld message count", fTeam);
fMessageCountSem = create_sem(0, name);
if (fMessageCountSem < 0) {
printf("debug_server: TeamDebugHandler::Init(): Failed to create "
debug_printf("debug_server: TeamDebugHandler::Init(): Failed to create "
"message count semaphore: %s\n", strerror(fMessageCountSem));
return fMessageCountSem;
}
@ -366,7 +366,7 @@ TeamDebugHandler::Init(port_id nubPort)
fHandlerThread = spawn_thread(&_HandlerThreadEntry, name, B_NORMAL_PRIORITY,
this);
if (fHandlerThread < 0) {
printf("debug_server: TeamDebugHandler::Init(): Failed to spawn "
debug_printf("debug_server: TeamDebugHandler::Init(): Failed to spawn "
"handler thread: %s\n", strerror(fHandlerThread));
return fHandlerThread;
}
@ -425,20 +425,7 @@ TeamDebugHandler::_EnterDebugger()
TRACE(("debug_server: TeamDebugHandler::_EnterDebugger(): team %ld\n",
fTeam));
bool debugInConsoled = _IsAppServer();
if (debugInConsoled) {
TRACE(("debug_server: TeamDebugHandler::_EnterDebugger(): team %ld is "
"the app server. Killing input_server...\n", fTeam));
// kill the input server
team_id isTeam = _FindTeam("input_server");
if (isTeam >= 0) {
printf("debug_server: preparing for debugging the app server: "
"killing the input server\n");
kill_team(isTeam);
}
}
bool debugInConsoled = _IsGUIServer() || !_AreGUIServersAlive();
// prepare a debugger handover
TRACE(("debug_server: TeamDebugHandler::_EnterDebugger(): preparing "
@ -447,7 +434,7 @@ TeamDebugHandler::_EnterDebugger()
status_t error = send_debug_message(&fDebugContext,
B_DEBUG_MESSAGE_PREPARE_HANDOVER, NULL, 0, NULL, 0);
if (error != B_OK) {
printf("debug_server: Failed to prepare debugger handover: %s\n",
debug_printf("debug_server: Failed to prepare debugger handover: %s\n",
strerror(error));
return error;
}
@ -482,7 +469,7 @@ TeamDebugHandler::_EnterDebugger()
thread_id thread = load_image(argc, argv, (const char**)environ);
if (thread < 0) {
printf("debug_server: Failed to start consoled + gdb: %s\n",
debug_printf("debug_server: Failed to start consoled + gdb: %s\n",
strerror(thread));
return thread;
}
@ -519,7 +506,7 @@ TeamDebugHandler::_HandleMessage(DebugMessage *message)
switch (message->Code()) {
case B_DEBUGGER_MESSAGE_TEAM_DELETED:
// This shouldn't happen.
printf("debug_server: Got a spurious "
debug_printf("debug_server: Got a spurious "
"B_DEBUGGER_MESSAGE_TEAM_DELETED message for team %ld\n",
fTeam);
return true;
@ -556,7 +543,7 @@ TeamDebugHandler::_HandleMessage(DebugMessage *message)
break;
}
printf("debug_server: Thread %ld entered the debugger: %s\n", thread,
debug_printf("debug_server: Thread %ld entered the debugger: %s\n", thread,
buffer);
_PrintStackTrace(thread);
@ -565,10 +552,8 @@ TeamDebugHandler::_HandleMessage(DebugMessage *message)
// ask the user whether to debug or kill the team
if (_IsGUIServer()) {
// App or input server. If it's the app server, we'll try to debug it.
kill = !(_IsAppServer() && strlen(fExecutablePath) > 0);
debug_printf("*** GUI server died: thread %ld, %s: %s\n", thread, fExecutablePath, buffer);
// TODO: for now, so that we know what's going on
// App server, input server, or registrar. We always debug those.
kill = !(strlen(fExecutablePath) > 0);
} else if (USE_GUI && _AreGUIServersAlive() && _InitGUI() == B_OK) {
// normal app
@ -666,8 +651,8 @@ TeamDebugHandler::_PrintStackTrace(thread_id thread)
error = debug_create_symbol_lookup_context(&fDebugContext,
&lookupContext);
if (error != B_OK) {
printf("debug_server: Failed to create symbol lookup context: %s\n",
strerror(error));
debug_printf("debug_server: Failed to create symbol lookup "
"context: %s\n", strerror(error));
}
// lookup the IP
@ -675,7 +660,7 @@ TeamDebugHandler::_PrintStackTrace(thread_id thread)
_LookupSymbolAddress(lookupContext, ip, symbolBuffer,
sizeof(symbolBuffer) - 1);
printf("stack trace, current PC %p %s:\n", ip, symbolBuffer);
debug_printf("stack trace, current PC %p %s:\n", ip, symbolBuffer);
for (int32 i = 0; i < 50; i++) {
debug_stack_frame_info stackFrameInfo;
@ -689,7 +674,7 @@ TeamDebugHandler::_PrintStackTrace(thread_id thread)
_LookupSymbolAddress(lookupContext, stackFrameInfo.return_address,
symbolBuffer, sizeof(symbolBuffer) - 1);
printf(" (%p) %p %s\n", stackFrameInfo.frame,
debug_printf(" (%p) %p %s\n", stackFrameInfo.frame,
stackFrameInfo.return_address, symbolBuffer);
stackFrameAddress = stackFrameInfo.parent_frame;
@ -746,8 +731,8 @@ TeamDebugHandler::_HandlerThread()
kill = _HandleMessage(message);
delete message;
} else {
printf("TeamDebugHandler::_HandlerThread(): Failed to pop initial "
"message: %s", strerror(error));
debug_printf("TeamDebugHandler::_HandlerThread(): Failed to pop "
"initial message: %s", strerror(error));
kill = true;
}
@ -763,8 +748,8 @@ TeamDebugHandler::_HandlerThread()
do {
error = _PopMessage(message);
if (error != B_OK) {
printf("TeamDebugHandler::_HandlerThread(): Failed to pop "
"message: %s", strerror(error));
debug_printf("TeamDebugHandler::_HandlerThread(): Failed to "
"pop message: %s", strerror(error));
kill = true;
break;
}
@ -784,8 +769,8 @@ TeamDebugHandler::_HandlerThread()
thread_info threadInfo;
if (get_thread_info(debuggerThread, &threadInfo) != B_OK) {
// the debugger is gone
printf("debug_server: The debugger for team %ld seems to "
"be gone.", fTeam);
debug_printf("debug_server: The debugger for team %ld "
"seems to be gone.", fTeam);
kill = true;
terminate = true;
@ -948,8 +933,8 @@ DebugServer::_Listener()
} while (bytesRead == B_INTERRUPTED);
if (bytesRead < 0) {
fprintf(stderr, "debug_server: Failed to read from listener port: "
"%s\n", strerror(bytesRead));
debug_printf("debug_server: Failed to read from listener port: "
"%s. Terminating!\n", strerror(bytesRead));
exit(1);
}
TRACE(("debug_server: Got debug message: team: %ld, code: %ld\n",
@ -976,7 +961,7 @@ main()
// for the time being let the debug server print to the syslog
int console = open("/dev/dprintf", O_RDONLY);
if (console < 0) {
fprintf(stderr, "debug_server: Failed to open console: %s\n",
debug_printf("debug_server: Failed to open console: %s\n",
strerror(errno));
}
dup2(console, STDOUT_FILENO);
@ -985,7 +970,7 @@ main()
// create the team debug handler roster
if (!TeamDebugHandlerRoster::CreateDefault()) {
fprintf(stderr, "debug_server: Failed to create team debug handler "
debug_printf("debug_server: Failed to create team debug handler "
"roster.\n");
exit(1);
}
@ -993,7 +978,7 @@ main()
// create application
DebugServer server(error);
if (error != B_OK) {
fprintf(stderr, "debug_server: Failed to create BApplication: %s\n",
debug_printf("debug_server: Failed to create BApplication: %s\n",
strerror(error));
exit(1);
}
@ -1001,7 +986,7 @@ main()
// init application
error = server.Init();
if (error != B_OK) {
fprintf(stderr, "debug_server: Failed to init application: %s\n",
debug_printf("debug_server: Failed to init application: %s\n",
strerror(error));
exit(1);
}