Added DwarfTeamDebugInfo and DwarfImageDebugInfo, the classes to interface with
the DWARF code. Not doing much yet. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31284 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -21,6 +21,12 @@ SubDirHdrs [ FDirName $(SUBDIR) demangler ] ;
|
|||||||
SubDirHdrs [ FDirName $(HAIKU_TOP) src bin debug ] ;
|
SubDirHdrs [ FDirName $(HAIKU_TOP) src bin debug ] ;
|
||||||
SubDirHdrs [ FDirName $(debugAnalyzerSources) gui ] ;
|
SubDirHdrs [ FDirName $(debugAnalyzerSources) gui ] ;
|
||||||
|
|
||||||
|
SourceHdrs
|
||||||
|
DwarfImageDebugInfo.cpp
|
||||||
|
DwarfTeamDebugInfo.cpp
|
||||||
|
: [ FDirName $(SUBDIR) dwarf ]
|
||||||
|
;
|
||||||
|
|
||||||
Application Debugger :
|
Application Debugger :
|
||||||
BreakpointManager.cpp
|
BreakpointManager.cpp
|
||||||
Debugger.cpp
|
Debugger.cpp
|
||||||
@@ -43,6 +49,8 @@ Application Debugger :
|
|||||||
BasicFunctionDebugInfo.cpp
|
BasicFunctionDebugInfo.cpp
|
||||||
DebuggerImageDebugInfo.cpp
|
DebuggerImageDebugInfo.cpp
|
||||||
DebuggerTeamDebugInfo.cpp
|
DebuggerTeamDebugInfo.cpp
|
||||||
|
DwarfImageDebugInfo.cpp
|
||||||
|
DwarfTeamDebugInfo.cpp
|
||||||
FunctionDebugInfo.cpp
|
FunctionDebugInfo.cpp
|
||||||
ImageDebugInfo.cpp
|
ImageDebugInfo.cpp
|
||||||
ImageDebugInfoProvider.cpp
|
ImageDebugInfoProvider.cpp
|
||||||
|
|||||||
@@ -0,0 +1,96 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2009, Ingo Weinhold, [email protected].
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "DwarfImageDebugInfo.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include <new>
|
||||||
|
|
||||||
|
#include <AutoDeleter.h>
|
||||||
|
|
||||||
|
#include "Architecture.h"
|
||||||
|
#include "CompilationUnit.h"
|
||||||
|
#include "DebugInfoEntries.h"
|
||||||
|
#include "Dwarf.h"
|
||||||
|
#include "DwarfFile.h"
|
||||||
|
|
||||||
|
|
||||||
|
DwarfImageDebugInfo::DwarfImageDebugInfo(const ImageInfo& imageInfo,
|
||||||
|
Architecture* architecture, DwarfFile* file)
|
||||||
|
:
|
||||||
|
fImageInfo(imageInfo),
|
||||||
|
fArchitecture(architecture),
|
||||||
|
fFile(file)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DwarfImageDebugInfo::~DwarfImageDebugInfo()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
DwarfImageDebugInfo::Init()
|
||||||
|
{
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
DwarfImageDebugInfo::GetFunctions(BObjectList<FunctionDebugInfo>& functions)
|
||||||
|
{
|
||||||
|
printf("DwarfImageDebugInfo::GetFunctions()\n");
|
||||||
|
printf(" %ld compilation units\n", fFile->CountCompilationUnits());
|
||||||
|
|
||||||
|
for (int32 i = 0; CompilationUnit* unit = fFile->CompilationUnitAt(i);
|
||||||
|
i++) {
|
||||||
|
printf(" %s:\n", unit->UnitEntry()->Name());
|
||||||
|
|
||||||
|
for (DebugInfoEntryList::ConstIterator it
|
||||||
|
= unit->UnitEntry()->OtherChildren().GetIterator();
|
||||||
|
DebugInfoEntry* entry = it.Next();) {
|
||||||
|
if (entry->Tag() != DW_TAG_subprogram)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
DIESubprogram* subprogramEntry = static_cast<DIESubprogram*>(entry);
|
||||||
|
printf(" subprogram entry: %p, name: %s, declaration: %d\n",
|
||||||
|
subprogramEntry, subprogramEntry->Name(),
|
||||||
|
subprogramEntry->IsDeclaration());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO:...
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
DwarfImageDebugInfo::CreateFrame(Image* image, FunctionDebugInfo* function,
|
||||||
|
CpuState* cpuState, StackFrame*& _previousFrame,
|
||||||
|
CpuState*& _previousCpuState)
|
||||||
|
{
|
||||||
|
// TODO:...
|
||||||
|
return B_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
DwarfImageDebugInfo::LoadSourceCode(FunctionDebugInfo* function,
|
||||||
|
SourceCode*& _sourceCode)
|
||||||
|
{
|
||||||
|
// TODO:...
|
||||||
|
return B_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
DwarfImageDebugInfo::GetStatement(FunctionDebugInfo* function,
|
||||||
|
target_addr_t address, Statement*& _statement)
|
||||||
|
{
|
||||||
|
// TODO:...
|
||||||
|
return fArchitecture->GetStatement(function, address, _statement);
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
#ifndef DWARF_IMAGE_DEBUG_INFO_H
|
||||||
|
#define DWARF_IMAGE_DEBUG_INFO_H
|
||||||
|
|
||||||
|
#include "ImageInfo.h"
|
||||||
|
#include "SpecificImageDebugInfo.h"
|
||||||
|
|
||||||
|
|
||||||
|
class Architecture;
|
||||||
|
class DwarfFile;
|
||||||
|
|
||||||
|
|
||||||
|
class DwarfImageDebugInfo : public SpecificImageDebugInfo {
|
||||||
|
public:
|
||||||
|
DwarfImageDebugInfo(const ImageInfo& imageInfo,
|
||||||
|
Architecture* architecture,
|
||||||
|
DwarfFile* file);
|
||||||
|
virtual ~DwarfImageDebugInfo();
|
||||||
|
|
||||||
|
status_t Init();
|
||||||
|
|
||||||
|
virtual status_t GetFunctions(
|
||||||
|
BObjectList<FunctionDebugInfo>& functions);
|
||||||
|
virtual status_t CreateFrame(Image* image,
|
||||||
|
FunctionDebugInfo* function,
|
||||||
|
CpuState* cpuState,
|
||||||
|
StackFrame*& _previousFrame,
|
||||||
|
CpuState*& _previousCpuState);
|
||||||
|
virtual status_t LoadSourceCode(FunctionDebugInfo* function,
|
||||||
|
SourceCode*& _sourceCode);
|
||||||
|
virtual status_t GetStatement(FunctionDebugInfo* function,
|
||||||
|
target_addr_t address,
|
||||||
|
Statement*& _statement);
|
||||||
|
|
||||||
|
private:
|
||||||
|
ImageInfo fImageInfo;
|
||||||
|
Architecture* fArchitecture;
|
||||||
|
DwarfFile* fFile;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif // DWARF_IMAGE_DEBUG_INFO_H
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "DwarfTeamDebugInfo.h"
|
||||||
|
|
||||||
|
#include <new>
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "DwarfImageDebugInfo.h"
|
||||||
|
#include "DwarfManager.h"
|
||||||
|
|
||||||
|
|
||||||
|
DwarfTeamDebugInfo::DwarfTeamDebugInfo(Architecture* architecture)
|
||||||
|
:
|
||||||
|
fArchitecture(architecture),
|
||||||
|
fManager(NULL)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DwarfTeamDebugInfo::~DwarfTeamDebugInfo()
|
||||||
|
{
|
||||||
|
delete fManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
DwarfTeamDebugInfo::Init()
|
||||||
|
{
|
||||||
|
fManager = new(std::nothrow) DwarfManager;
|
||||||
|
if (fManager == NULL)
|
||||||
|
return B_NO_MEMORY;
|
||||||
|
|
||||||
|
status_t error = fManager->Init();
|
||||||
|
if (error != B_OK)
|
||||||
|
return error;
|
||||||
|
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
DwarfTeamDebugInfo::CreateImageDebugInfo(const ImageInfo& imageInfo,
|
||||||
|
SpecificImageDebugInfo*& _imageDebugInfo)
|
||||||
|
{
|
||||||
|
// We only want images that belong to shared objects.
|
||||||
|
if (strchr(imageInfo.Name(), '/') == NULL)
|
||||||
|
return B_ENTRY_NOT_FOUND;
|
||||||
|
|
||||||
|
// try to load the DWARF file
|
||||||
|
DwarfFile* file;
|
||||||
|
status_t error = fManager->LoadFile(imageInfo.Name(), file);
|
||||||
|
if (error == B_OK)
|
||||||
|
error = fManager->FinishLoading();
|
||||||
|
if (error != B_OK)
|
||||||
|
return error;
|
||||||
|
|
||||||
|
// create the image debug info
|
||||||
|
DwarfImageDebugInfo* debuggerInfo = new(std::nothrow) DwarfImageDebugInfo(
|
||||||
|
imageInfo, fArchitecture, file);
|
||||||
|
if (debuggerInfo == NULL)
|
||||||
|
return B_NO_MEMORY;
|
||||||
|
|
||||||
|
error = debuggerInfo->Init();
|
||||||
|
if (error != B_OK) {
|
||||||
|
delete debuggerInfo;
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
_imageDebugInfo = debuggerInfo;
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
#ifndef DWARF_TEAM_DEBUG_INFO_H
|
||||||
|
#define DWARF_TEAM_DEBUG_INFO_H
|
||||||
|
|
||||||
|
#include "SpecificTeamDebugInfo.h"
|
||||||
|
|
||||||
|
|
||||||
|
class Architecture;
|
||||||
|
class DwarfManager;
|
||||||
|
class ImageInfo;
|
||||||
|
|
||||||
|
|
||||||
|
class DwarfTeamDebugInfo : public SpecificTeamDebugInfo {
|
||||||
|
public:
|
||||||
|
DwarfTeamDebugInfo(Architecture* architecture);
|
||||||
|
virtual ~DwarfTeamDebugInfo();
|
||||||
|
|
||||||
|
status_t Init();
|
||||||
|
|
||||||
|
virtual status_t CreateImageDebugInfo(const ImageInfo& imageInfo,
|
||||||
|
SpecificImageDebugInfo*& _imageDebugInfo);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Architecture* fArchitecture;
|
||||||
|
DwarfManager* fManager;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif // DWARF_TEAM_DEBUG_INFO_H
|
||||||
@@ -10,6 +10,7 @@
|
|||||||
#include <AutoDeleter.h>
|
#include <AutoDeleter.h>
|
||||||
|
|
||||||
#include "DebuggerTeamDebugInfo.h"
|
#include "DebuggerTeamDebugInfo.h"
|
||||||
|
#include "DwarfTeamDebugInfo.h"
|
||||||
#include "ImageDebugInfo.h"
|
#include "ImageDebugInfo.h"
|
||||||
#include "SpecificImageDebugInfo.h"
|
#include "SpecificImageDebugInfo.h"
|
||||||
|
|
||||||
@@ -32,10 +33,20 @@ TeamDebugInfo::~TeamDebugInfo()
|
|||||||
status_t
|
status_t
|
||||||
TeamDebugInfo::Init()
|
TeamDebugInfo::Init()
|
||||||
{
|
{
|
||||||
// create specific infos for all types of debug info we support
|
// Create specific infos for all types of debug info we support, in
|
||||||
|
// descending order of expressiveness.
|
||||||
|
|
||||||
// DWARF
|
// DWARF
|
||||||
// TODO:...
|
DwarfTeamDebugInfo* dwarfInfo = new(std::nothrow) DwarfTeamDebugInfo(
|
||||||
|
fArchitecture);
|
||||||
|
if (dwarfInfo == NULL || !fSpecificInfos.AddItem(dwarfInfo)) {
|
||||||
|
delete dwarfInfo;
|
||||||
|
return B_NO_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
status_t error = dwarfInfo->Init();
|
||||||
|
if (error != B_OK)
|
||||||
|
return error;
|
||||||
|
|
||||||
// debugger based info
|
// debugger based info
|
||||||
DebuggerTeamDebugInfo* debuggerInfo
|
DebuggerTeamDebugInfo* debuggerInfo
|
||||||
@@ -46,7 +57,7 @@ TeamDebugInfo::Init()
|
|||||||
return B_NO_MEMORY;
|
return B_NO_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
status_t error = debuggerInfo->Init();
|
error = debuggerInfo->Init();
|
||||||
if (error != B_OK)
|
if (error != B_OK)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user