[Haiku-commits] r31068 - haiku/trunk/src/apps/debugger
bonefish at mail.berlios.de
bonefish at mail.berlios.de
Tue Jun 16 02:25:45 CEST 2009
Author: bonefish
Date: 2009-06-16 02:25:36 +0200 (Tue, 16 Jun 2009)
New Revision: 31068
ViewCVS: http://svn.berlios.de/viewcvs/haiku?rev=31068&view=rev
Added:
haiku/trunk/src/apps/debugger/Image.cpp
haiku/trunk/src/apps/debugger/Image.h
haiku/trunk/src/apps/debugger/Team.cpp
haiku/trunk/src/apps/debugger/Team.h
haiku/trunk/src/apps/debugger/TeamDebugger.cpp
haiku/trunk/src/apps/debugger/TeamDebugger.h
haiku/trunk/src/apps/debugger/Thread.cpp
haiku/trunk/src/apps/debugger/Thread.h
Modified:
haiku/trunk/src/apps/debugger/Jamfile
haiku/trunk/src/apps/debugger/debugger.cpp
Log:
Initial skeletons of the model (Team, Thread, Image) and the controller
(TeamDebugger) for debugging a team.
Added: haiku/trunk/src/apps/debugger/Image.cpp
===================================================================
--- haiku/trunk/src/apps/debugger/Image.cpp 2009-06-15 23:12:16 UTC (rev 31067)
+++ haiku/trunk/src/apps/debugger/Image.cpp 2009-06-16 00:25:36 UTC (rev 31068)
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2009, Ingo Weinhold, ingo_weinhold at gmx.de.
+ * Distributed under the terms of the MIT License.
+ */
+
+#include "Image.h"
+
+
+Image::Image(const image_info& imageInfo)
+ :
+ fInfo(imageInfo)
+{
+}
+
+
+Image::~Image()
+{
+}
+
+
+status_t
+Image::Init()
+{
+ return B_OK;
+}
Added: haiku/trunk/src/apps/debugger/Image.h
===================================================================
--- haiku/trunk/src/apps/debugger/Image.h 2009-06-15 23:12:16 UTC (rev 31067)
+++ haiku/trunk/src/apps/debugger/Image.h 2009-06-16 00:25:36 UTC (rev 31068)
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2009, Ingo Weinhold, ingo_weinhold at gmx.de.
+ * Distributed under the terms of the MIT License.
+ */
+#ifndef IMAGE_H
+#define IMAGE_H
+
+#include <image.h>
+
+#include <util/DoublyLinkedList.h>
+
+
+class Image : public DoublyLinkedListLinkImpl<Image> {
+public:
+ Image(const image_info& imageInfo);
+ ~Image();
+
+ status_t Init();
+
+ image_id ID() const { return fInfo.id; }
+ const char* Name() const { return fInfo.name; }
+ const image_info& Info() const { return fInfo; }
+
+private:
+ image_info fInfo;
+};
+
+
+typedef DoublyLinkedList<Image> ImageList;
+
+
+#endif // IMAGE_H
Modified: haiku/trunk/src/apps/debugger/Jamfile
===================================================================
--- haiku/trunk/src/apps/debugger/Jamfile 2009-06-15 23:12:16 UTC (rev 31067)
+++ haiku/trunk/src/apps/debugger/Jamfile 2009-06-16 00:25:36 UTC (rev 31068)
@@ -10,6 +10,11 @@
debugger.cpp
ElfFile.cpp
+ Image.cpp
+ TeamDebugger.cpp
+ Team.cpp
+ Thread.cpp
+
# DWARF
# attribute_classes.cpp
# AttributeValue.cpp
@@ -19,6 +24,7 @@
# SourceLanguageInfo.cpp
# tag_names.cpp
- : $(TARGET_LIBSUPC++)
+ : $(TARGET_LIBSUPC++) be
;
+HaikuSubInclude gui running_teams_window ;
Added: haiku/trunk/src/apps/debugger/Team.cpp
===================================================================
--- haiku/trunk/src/apps/debugger/Team.cpp 2009-06-15 23:12:16 UTC (rev 31067)
+++ haiku/trunk/src/apps/debugger/Team.cpp 2009-06-16 00:25:36 UTC (rev 31068)
@@ -0,0 +1,164 @@
+/*
+ * Copyright 2009, Ingo Weinhold, ingo_weinhold at gmx.de.
+ * Distributed under the terms of the MIT License.
+ */
+
+#include "Team.h"
+
+#include <new>
+
+
+Team::Team(team_id teamID)
+ :
+ fID(teamID)
+{
+}
+
+
+Team::~Team()
+{
+ while (Image* image = fImages.RemoveHead())
+ delete image;
+
+ while (Thread* thread = fThreads.RemoveHead())
+ delete thread;
+}
+
+
+status_t
+Team::Init()
+{
+ return BLocker::InitCheck();
+}
+
+
+void
+Team::SetName(const BString& name)
+{
+ fName = name;
+}
+
+
+void
+Team::AddThread(Thread* thread)
+{
+ fThreads.Add(thread);
+}
+
+
+status_t
+Team::AddThread(const thread_info& threadInfo, Thread** _thread)
+{
+ Thread* thread = new(std::nothrow) Thread(threadInfo.thread);
+ if (thread == NULL)
+ return B_NO_MEMORY;
+
+ status_t error = thread->Init();
+ if (error != B_OK) {
+ delete thread;
+ return error;
+ }
+
+ thread->SetName(threadInfo.name);
+ AddThread(thread);
+
+ if (_thread != NULL)
+ *_thread = thread;
+
+ return B_OK;
+}
+
+
+void
+Team::RemoveThread(Thread* thread)
+{
+ fThreads.Remove(thread);
+}
+
+
+bool
+Team::RemoveThread(thread_id threadID)
+{
+ Thread* thread = ThreadByID(threadID);
+ if (thread == NULL)
+ return false;
+
+ RemoveThread(thread);
+ delete thread;
+ return true;
+}
+
+
+Thread*
+Team::ThreadByID(thread_id threadID) const
+{
+ for (ThreadList::ConstIterator it = fThreads.GetIterator();
+ Thread* thread = it.Next();) {
+ if (thread->ID() == threadID)
+ return thread;
+ }
+
+ return NULL;
+}
+
+
+void
+Team::AddImage(Image* image)
+{
+ fImages.Add(image);
+}
+
+
+status_t
+Team::AddImage(const image_info& imageInfo, Image** _image)
+{
+ Image* image = new(std::nothrow) Image(imageInfo);
+ if (image == NULL)
+ return B_NO_MEMORY;
+
+ status_t error = image->Init();
+ if (error != B_OK) {
+ delete image;
+ return error;
+ }
+
+ AddImage(image);
+
+ if (_image != NULL)
+ *_image = image;
+
+ return B_OK;
+}
+
+
+void
+Team::RemoveImage(Image* image)
+{
+ fImages.Remove(image);
+}
+
+
+bool
+Team::RemoveImage(image_id imageID)
+{
+ Image* image = ImageByID(imageID);
+ if (image == NULL)
+ return false;
+
+ RemoveImage(image);
+ delete image;
+ return true;
+}
+
+
+Image*
+Team::ImageByID(image_id imageID) const
+{
+ for (ImageList::ConstIterator it = fImages.GetIterator();
+ Image* image = it.Next();) {
+ if (image->ID() == imageID)
+ return image;
+ }
+
+ return NULL;
+}
Added: haiku/trunk/src/apps/debugger/Team.h
===================================================================
--- haiku/trunk/src/apps/debugger/Team.h 2009-06-15 23:12:16 UTC (rev 31067)
+++ haiku/trunk/src/apps/debugger/Team.h 2009-06-16 00:25:36 UTC (rev 31068)
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2009, Ingo Weinhold, ingo_weinhold at gmx.de.
+ * Distributed under the terms of the MIT License.
+ */
+#ifndef TEAM_H
+#define TEAM_H
+
+#include <Locker.h>
+
+#include "Image.h"
+#include "Thread.h"
+
+
+class Team : public BLocker {
+public:
+ Team(team_id teamID);
+ ~Team();
+
+ status_t Init();
+
+ team_id ID() const { return fID; }
+
+ const char* Name() const { return fName.String(); }
+ void SetName(const BString& name);
+
+ void AddThread(Thread* thread);
+ status_t AddThread(const thread_info& threadInfo,
+ Thread** _thread = NULL);
+ void RemoveThread(Thread* thread);
+ bool RemoveThread(thread_id threadID);
+ Thread* ThreadByID(thread_id threadID) const;
+
+ void AddImage(Image* image);
+ status_t AddImage(const image_info& imageInfo,
+ Image** _image = NULL);
+ void RemoveImage(Image* image);
+ bool RemoveImage(image_id imageID);
+ Image* ImageByID(image_id imageID) const;
+
+private:
+ team_id fID;
+ BString fName;
+ ThreadList fThreads;
+ ImageList fImages;
+};
+
+#endif // TEAM_H
Added: haiku/trunk/src/apps/debugger/TeamDebugger.cpp
===================================================================
--- haiku/trunk/src/apps/debugger/TeamDebugger.cpp 2009-06-15 23:12:16 UTC (rev 31067)
+++ haiku/trunk/src/apps/debugger/TeamDebugger.cpp 2009-06-16 00:25:36 UTC (rev 31068)
@@ -0,0 +1,205 @@
+/*
+ * Copyright 2009, Ingo Weinhold, ingo_weinhold at gmx.de.
+ * Distributed under the terms of the MIT License.
+ */
+
+#include "TeamDebugger.h"
+
+#include <stdio.h>
+
+#include <new>
+
+#include <AutoLocker.h>
+
+#include "Team.h"
+
+
+TeamDebugger::TeamDebugger()
+ :
+ fLock("team debugger"),
+ fTeam(NULL),
+ fTeamID(-1),
+ fDebuggerPort(-1),
+ fNubPort(-1),
+ fDebugEventListener(-1),
+ fTerminating(false)
+{
+}
+
+
+TeamDebugger::~TeamDebugger()
+{
+ AutoLocker<BLocker> locker(fLock);
+
+ fTerminating = true;
+
+ if (fDebuggerPort >= 0)
+ delete_port(fDebuggerPort);
+
+ locker.Unlock();
+
+ if (fDebugEventListener >= 0)
+ wait_for_thread(fDebugEventListener, NULL);
+
+ delete fTeam;
+}
+
+
+status_t
+TeamDebugger::Init(team_id teamID)
+{
+ fTeamID = teamID;
+
+ status_t error = fLock.InitCheck();
+ if (error != B_OK)
+ return error;
+
+ // check whether the team exists at all
+ team_info teamInfo;
+ error = get_team_info(fTeamID, &teamInfo);
+ if (error != B_OK)
+ return error;
+
+ // create a team object
+ fTeam = new(std::nothrow) Team(fTeamID);
+ if (fTeam == NULL)
+ return B_NO_MEMORY;
+
+ error = fTeam->Init();
+ if (error != B_OK)
+ return error;
+ fTeam->SetName(teamInfo.args);
+ // TODO: Set a better name!
+
+ // create debugger port
+ char buffer[128];
+ snprintf(buffer, sizeof(buffer), "team %ld debugger", fTeamID);
+ fDebuggerPort = create_port(100, buffer);
+ if (fDebuggerPort < 0)
+ return fDebuggerPort;
+
+ // install as team debugger
+ fNubPort = install_team_debugger(fTeamID, fDebuggerPort);
+ if (fNubPort < 0)
+ return fNubPort;
+
+// TODO: Set the debug event flags!
+
+ // get the initial state of the team
+ AutoLocker<Team> teamLocker(fTeam);
+
+ thread_info threadInfo;
+ int32 cookie = 0;
+ while (get_next_thread_info(fTeamID, &cookie, &threadInfo) == B_OK) {
+ error = fTeam->AddThread(threadInfo);
+ if (error != B_OK)
+ return error;
+ }
+
+ image_info imageInfo;
+ cookie = 0;
+ while (get_next_image_info(fTeamID, &cookie, &imageInfo) == B_OK) {
+ error = fTeam->AddImage(imageInfo);
+ if (error != B_OK)
+ return error;
+ }
+
+ // create the debug event listener
+ snprintf(buffer, sizeof(buffer), "team %ld debug listener", fTeamID);
+ fDebugEventListener = spawn_thread(_DebugEventListenerEntry, buffer,
+ B_NORMAL_PRIORITY, this);
+ if (fDebugEventListener < 0)
+ return fDebugEventListener;
+
+ resume_thread(fDebugEventListener);
+
+ return B_OK;
+}
+
+
+/*static*/ status_t
+TeamDebugger::_DebugEventListenerEntry(void* data)
+{
+ return ((TeamDebugger*)data)->_DebugEventListener();
+}
+
+
+status_t
+TeamDebugger::_DebugEventListener()
+{
+ while (!fTerminating) {
+ // read the next message
+ debug_debugger_message_data message;
+ int32 messageCode;
+ ssize_t size = read_port(fDebuggerPort, &messageCode, &message,
+ sizeof(message));
+ if (size < 0) {
+ if (size == B_INTERRUPTED)
+ continue;
+// TODO: Error handling!
+ break;
+ }
+
+ if (message.origin.team != fTeamID) {
+printf("TeamDebugger for team %ld: received message from team %ld!\n", fTeamID,
+message.origin.team);
+ continue;
+ }
+
+ _HandleDebuggerMessage(messageCode, message);
+
+ if (messageCode == B_DEBUGGER_MESSAGE_TEAM_DELETED
+ || messageCode == B_DEBUGGER_MESSAGE_TEAM_EXEC) {
+ // TODO:...
+ break;
+ }
+ }
+
+ return B_OK;
+}
+
+
+void
+TeamDebugger::_HandleDebuggerMessage(int32 messageCode,
+ const debug_debugger_message_data& message)
+{
+ switch (messageCode) {
+ case B_DEBUGGER_MESSAGE_THREAD_DEBUGGED:
+ break;
+ case B_DEBUGGER_MESSAGE_DEBUGGER_CALL:
+ break;
+ case B_DEBUGGER_MESSAGE_BREAKPOINT_HIT:
+ break;
+ case B_DEBUGGER_MESSAGE_WATCHPOINT_HIT:
+ break;
+ case B_DEBUGGER_MESSAGE_SINGLE_STEP:
+ break;
+ case B_DEBUGGER_MESSAGE_EXCEPTION_OCCURRED:
+ break;
+ case B_DEBUGGER_MESSAGE_TEAM_CREATED:
+ break;
+ case B_DEBUGGER_MESSAGE_TEAM_DELETED:
+ break;
+ case B_DEBUGGER_MESSAGE_TEAM_EXEC:
+ break;
+ case B_DEBUGGER_MESSAGE_THREAD_CREATED:
+ break;
+ case B_DEBUGGER_MESSAGE_THREAD_DELETED:
+ break;
+ case B_DEBUGGER_MESSAGE_IMAGE_CREATED:
+ break;
+ case B_DEBUGGER_MESSAGE_IMAGE_DELETED:
+ break;
+ case B_DEBUGGER_MESSAGE_PRE_SYSCALL:
+ case B_DEBUGGER_MESSAGE_POST_SYSCALL:
+ case B_DEBUGGER_MESSAGE_SIGNAL_RECEIVED:
+ case B_DEBUGGER_MESSAGE_PROFILER_UPDATE:
+ case B_DEBUGGER_MESSAGE_HANDED_OVER:
+ // not interested
+ break;
+ default:
+ printf("TeamDebugger for team %ld: unknown message from kernel: "
+ "%ld\n", fTeamID, messageCode);
+ break;
+ }
+}
Added: haiku/trunk/src/apps/debugger/TeamDebugger.h
===================================================================
--- haiku/trunk/src/apps/debugger/TeamDebugger.h 2009-06-15 23:12:16 UTC (rev 31067)
+++ haiku/trunk/src/apps/debugger/TeamDebugger.h 2009-06-16 00:25:36 UTC (rev 31068)
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2009, Ingo Weinhold, ingo_weinhold at gmx.de.
+ * Distributed under the terms of the MIT License.
+ */
+#ifndef TEAM_DEBUGGER_H
+#define TEAM_DEBUGGER_H
+
+#include <debugger.h>
+#include <Locker.h>
+
+
+class Team;
+
+
+class TeamDebugger {
+public:
+ TeamDebugger();
+ ~TeamDebugger();
+
+ status_t Init(team_id teamID);
+
+
+private:
+ static status_t _DebugEventListenerEntry(void* data);
+ status_t _DebugEventListener();
+
+ void _HandleDebuggerMessage(int32 messageCode,
+ const debug_debugger_message_data& message);
+
+private:
+ BLocker fLock;
+ Team* fTeam;
+ team_id fTeamID;
+ port_id fDebuggerPort;
+ port_id fNubPort;
+ thread_id fDebugEventListener;
+ volatile bool fTerminating;
+};
+
+#endif // TEAM_DEBUGGER_H
Added: haiku/trunk/src/apps/debugger/Thread.cpp
===================================================================
--- haiku/trunk/src/apps/debugger/Thread.cpp 2009-06-15 23:12:16 UTC (rev 31067)
+++ haiku/trunk/src/apps/debugger/Thread.cpp 2009-06-16 00:25:36 UTC (rev 31068)
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2009, Ingo Weinhold, ingo_weinhold at gmx.de.
+ * Distributed under the terms of the MIT License.
+ */
+
+#include "Thread.h"
+
+
+Thread::Thread(thread_id threadID)
+ :
+ fID(threadID)
+{
+}
+
+
+Thread::~Thread()
+{
+}
+
+
+status_t
+Thread::Init()
+{
+ return B_OK;
+}
+
+
+void
+Thread::SetName(const BString& name)
+{
+ fName = name;
+}
Added: haiku/trunk/src/apps/debugger/Thread.h
===================================================================
--- haiku/trunk/src/apps/debugger/Thread.h 2009-06-15 23:12:16 UTC (rev 31067)
+++ haiku/trunk/src/apps/debugger/Thread.h 2009-06-16 00:25:36 UTC (rev 31068)
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2009, Ingo Weinhold, ingo_weinhold at gmx.de.
+ * Distributed under the terms of the MIT License.
+ */
+#ifndef THREAD_H
+#define THREAD_H
+
+#include <OS.h>
+#include <String.h>
+
+#include <util/DoublyLinkedList.h>
+
+
+class Thread : public DoublyLinkedListLinkImpl<Thread> {
+public:
+ Thread(thread_id threadID);
+ ~Thread();
+
+ status_t Init();
+
+ thread_id ID() const { return fID; }
+
+ const char* Name() const { return fName.String(); }
+ void SetName(const BString& name);
+
+
+private:
+ thread_id fID;
+ BString fName;
+};
+
+
+typedef DoublyLinkedList<Thread> ThreadList;
+
+
+#endif // THREAD_H
Modified: haiku/trunk/src/apps/debugger/debugger.cpp
===================================================================
--- haiku/trunk/src/apps/debugger/debugger.cpp 2009-06-15 23:12:16 UTC (rev 31067)
+++ haiku/trunk/src/apps/debugger/debugger.cpp 2009-06-16 00:25:36 UTC (rev 31068)
@@ -5,7 +5,7 @@
#include <stdio.h>
-#include "DwarfManager.h"
+//#include "DwarfManager.h"
int
@@ -18,9 +18,10 @@
const char* fileName = argv[1];
- DwarfManager manager;
- manager.LoadFile(fileName);
- manager.FinishLoading();
+// DwarfManager manager;
+// manager.LoadFile(fileName);
+// manager.FinishLoading();
+(void)fileName;
return 0;
}
More information about the Haiku-commits
mailing list