[PATCH 2/4] covoar: Use DWARF to map addresses to source files and lines.
Vijay Kumar Banerjee
vijaykumar9597 at gmail.com
Sat May 5 15:57:48 UTC 2018
Hello,
I'm getting this build failure after applying this patch
---
Build failed
-> task in 'ccovoar' failed with exit status 1:
{task 140086064254560: cxx app_common.cc -> app_common.cc.1.o}
['/usr/bin/g++', '-std=c++11', '-O2', '-g', '-Itester/covoar',
'-I../tester/covoar', '-Irtemstoolkit', '-I../rtemstoolkit',
'-Irtemstoolkit/elftoolchain/libelf',
'-I../rtemstoolkit/elftoolchain/libelf',
'-Irtemstoolkit/elftoolchain/common',
'-I../rtemstoolkit/elftoolchain/common', '-Irtemstoolkit/libiberty',
'-I../rtemstoolkit/libiberty', '../tester/covoar/app_common.cc', '-c',
'-o/home/lunatic/development/rtems/test/rtems-tools/build/tester/covoar/app_common.cc.1.o']
-- vijay
On 5 May 2018 at 14:10, Chris Johns <chrisj at rtems.org> wrote:
> ---
> tester/covoar/DesiredSymbols.cc | 122 ++----------------------------
> ----------
> tester/covoar/ExecutableInfo.cc | 80 +++++++++++++++++---------
> tester/covoar/ExecutableInfo.h | 41 +++++++++++---
> tester/covoar/covoar.cc | 2 +-
> tester/covoar/wscript | 2 +-
> 5 files changed, 94 insertions(+), 153 deletions(-)
>
> diff --git a/tester/covoar/DesiredSymbols.cc b/tester/covoar/
> DesiredSymbols.cc
> index 9957b28..79ee78d 100644
> --- a/tester/covoar/DesiredSymbols.cc
> +++ b/tester/covoar/DesiredSymbols.cc
> @@ -449,123 +449,13 @@ namespace Coverage {
>
> )
> {
> - char* base;
> - char* cStatus;
> - char command[512];
> - std::string fileName;
> - CoverageRanges::ranges_t::iterator ritr;
> - char rpath[PATH_MAX];
> - FILE* tmpfile;
> -
> - // Open a temporary file for the uncovered ranges.
> - tmpfile = fopen( "ranges1.tmp", "w" );
> - if ( !tmpfile ) {
> - fprintf(
> - stderr,
> - "ERROR: DesiredSymbols::determineSourceLines - "
> - "unable to open %s\n",
> - "ranges1.tmp"
> - );
> - exit(-1);
> - }
> -
> - // Write the range addresses to the temporary file.
> - for (ritr = theRanges->set.begin();
> - ritr != theRanges->set.end();
> - ritr++ ) {
> - fprintf(
> - tmpfile,
> - "0x%08x\n0x%08x\n",
> - ritr->lowAddress - theExecutable->getLoadAddress(),
> - ritr->highAddress - theExecutable->getLoadAddress()
> - );
> - }
> -
> - fclose( tmpfile );
> -
> - // Invoke addr2line to generate the source lines for each address.
> - if (theExecutable->hasDynamicLibrary())
> - fileName = theExecutable->getLibraryName();
> - else
> - fileName = theExecutable->getFileName();
> -
> - sprintf(
> - command,
> - "%s -Ce %s <%s | dos2unix >%s",
> - TargetInfo->getAddr2line(),
> - fileName.c_str(),
> - "ranges1.tmp",
> - "ranges2.tmp"
> - );
> -
> - if (system( command )) {
> - fprintf(
> - stderr,
> - "ERROR: DesiredSymbols::determineSourceLines - "
> - "command (%s) failed\n",
> - command
> - );
> - exit( -1 );
> - }
> -
> - // Open the addr2line output file.
> - tmpfile = fopen( "ranges2.tmp", "r" );
> - if ( !tmpfile ) {
> - fprintf(
> - stderr,
> - "ERROR: DesiredSymbols::determineSourceLines - "
> - "unable to open %s\n",
> - "ranges2.tmp"
> - );
> - exit(-1);
> + for (auto& r : theRanges->set) {
> + std::string location;
> + theExecutable->getSourceAndLine(r.lowAddress, location);
> + r.lowSourceLine = rld::path::basename (location);
> + theExecutable->getSourceAndLine(r.highAddress, location);
> + r.highSourceLine = rld::path::basename (location);
> }
> -
> - // Process the addr2line output.
> - for (ritr = theRanges->set.begin();
> - ritr != theRanges->set.end();
> - ritr++ ) {
> -
> - cStatus = fgets( inputBuffer, MAX_LINE_LENGTH, tmpfile );
> - if ( cStatus == NULL ) {
> - fprintf(
> - stderr,
> - "ERROR: DesiredSymbols::determineSourceLines - "
> - "Out of sync in addr2line output\n"
> - );
> - exit( -1 );
> - }
> - inputBuffer[ strlen(inputBuffer) - 1] = '\0';
> -
> - // Use only the base filename without directory path.
> -#ifdef _WIN32
> - #define realpath(N,R) _fullpath((R),(N),_MAX_PATH)
> -#endif
> - realpath( inputBuffer, rpath );
> - base = basename( rpath );
> -
> - ritr->lowSourceLine = std::string( base );
> -
> - cStatus = fgets( inputBuffer, MAX_LINE_LENGTH, tmpfile );
> - if ( cStatus == NULL ) {
> - fprintf(
> - stderr,
> - "ERROR: DesiredSymbols::determineSourceLines - "
> - "Out of sync in addr2line output\n"
> - );
> - exit( -1 );
> - }
> - inputBuffer[ strlen(inputBuffer) - 1] = '\0';
> -
> - // Use only the base filename without directory path.
> - realpath( inputBuffer, rpath );
> - base = basename( rpath );
> -
> - ritr->highSourceLine = std::string( base );
> - }
> -
> - fclose( tmpfile );
> - unlink( "ranges1.tmp" );
> - unlink( "ranges2.tmp" );
> }
>
> SymbolInformation* DesiredSymbols::find(
> diff --git a/tester/covoar/ExecutableInfo.cc b/tester/covoar/
> ExecutableInfo.cc
> index c41d931..1755e93 100644
> --- a/tester/covoar/ExecutableInfo.cc
> +++ b/tester/covoar/ExecutableInfo.cc
> @@ -7,6 +7,8 @@
>
> #include <stdio.h>
>
> +#include <rld.h>
> +
> #include "ExecutableInfo.h"
> #include "app_common.h"
> #include "CoverageMap.h"
> @@ -18,24 +20,36 @@ namespace Coverage {
> ExecutableInfo::ExecutableInfo(
> const char* const theExecutableName,
> const char* const theLibraryName
> - )
> + ) : executable(theExecutableName),
> + loadAddress(0)
> {
> - executableName = theExecutableName;
> - loadAddress = 0;
> - libraryName = "";
> if (theLibraryName)
> libraryName = theLibraryName;
> - theSymbolTable = new SymbolTable();
> + try {
> + executable.open();
> + executable.begin();
> + executable.load_symbols(symbols);
> + debug.begin(executable.elf());
> + debug.load_debug();
> + } catch (rld::error re) {
> + std::cerr << "error: "
> + << re.where << ": " << re.what
> + << std::endl;
> + exit(2);
> + } catch (...) {
> + exit(2);
> + }
> }
>
> ExecutableInfo::~ExecutableInfo()
> {
> - if (theSymbolTable)
> - delete theSymbolTable;
> + debug.end();
> + executable.end();
> + executable.close();
> }
>
> void ExecutableInfo::dumpCoverageMaps( void ) {
> - ExecutableInfo::coverageMaps_t::iterator itr;
> + ExecutableInfo::CoverageMaps::iterator itr;
>
> for (itr = coverageMaps.begin(); itr != coverageMaps.end(); itr++) {
> fprintf( stderr, "Coverage Map for %s\n", ((*itr).first).c_str() );;
> @@ -44,21 +58,22 @@ namespace Coverage {
> }
>
> void ExecutableInfo::dumpExecutableInfo( void ){
> - fprintf( stdout, "\n== Executable info ==\n");
> - fprintf( stdout, "executableName = %s\n", executableName.c_str());
> - fprintf( stdout, "libraryName = %s\n", libraryName.c_str());
> - fprintf( stdout, "loadAddress = %u\n", loadAddress);
> - theSymbolTable->dumpSymbolTable();
> + std::cout << std::endl
> + << "== Executable info ==" << std::endl
> + << "executable = " << getFileName () << std::endl
> + << "library = " << libraryName << std::endl
> + << "loadAddress = " << loadAddress << std::endl;
> + theSymbolTable.dumpSymbolTable();
> }
>
> CoverageMapBase* ExecutableInfo::getCoverageMap ( uint32_t address )
> {
> - CoverageMapBase* aCoverageMap = NULL;
> - coverageMaps_t::iterator it;
> - std::string itsSymbol;
> + CoverageMapBase* aCoverageMap = NULL;
> + CoverageMaps::iterator it;
> + std::string itsSymbol;
>
> // Obtain the coverage map containing the specified address.
> - itsSymbol = theSymbolTable->getSymbol( address );
> + itsSymbol = theSymbolTable.getSymbol( address );
> if (itsSymbol != "") {
> it = coverageMaps.find( itsSymbol );
> aCoverageMap = (*it).second;
> @@ -67,12 +82,12 @@ namespace Coverage {
> return aCoverageMap;
> }
>
> - const std::string& ExecutableInfo::getFileName ( void ) const
> + const std::string ExecutableInfo::getFileName ( void ) const
> {
> - return executableName;
> + return executable.name().full();
> }
>
> - const std::string& ExecutableInfo::getLibraryName( void ) const
> + const std::string ExecutableInfo::getLibraryName( void ) const
> {
> return libraryName;
> }
> @@ -83,9 +98,9 @@ namespace Coverage {
> }
>
>
> - SymbolTable* ExecutableInfo::getSymbolTable ( void ) const
> + SymbolTable* ExecutableInfo::getSymbolTable ( void )
> {
> - return theSymbolTable;
> + return &theSymbolTable;
> }
>
> CoverageMapBase* ExecutableInfo::createCoverageMap (
> @@ -95,8 +110,8 @@ namespace Coverage {
> uint32_t highAddress
> )
> {
> - CoverageMapBase *theMap;
> - ExecutableInfo::coverageMaps_t::iterator itr;
> + CoverageMapBase *theMap;
> + ExecutableInfo::CoverageMaps::iterator itr;
>
> itr = coverageMaps.find( symbolName );
> if ( itr == coverageMaps.end() ) {
> @@ -109,13 +124,26 @@ namespace Coverage {
> return theMap;
> }
>
> + void ExecutableInfo::getSourceAndLine(
> + const unsigned int address,
> + std::string& line
> + )
> + {
> + std::string file;
> + int lno;
> + debug.get_source (address, file, lno);
> + std::ostringstream ss;
> + ss << file << ':' << lno;
> + line = ss.str ();
> + }
> +
> bool ExecutableInfo::hasDynamicLibrary( void )
> {
> - return (libraryName != "");
> + return !libraryName.empty();
> }
>
> void ExecutableInfo::mergeCoverage( void ) {
> - ExecutableInfo::coverageMaps_t::iterator itr;
> + ExecutableInfo::CoverageMaps::iterator itr;
>
> for (itr = coverageMaps.begin(); itr != coverageMaps.end(); itr++) {
> SymbolsToAnalyze->mergeCoverageMap( (*itr).first, (*itr).second );
> diff --git a/tester/covoar/ExecutableInfo.h b/tester/covoar/
> ExecutableInfo.h
> index 20ea9bf..9106db3 100644
> --- a/tester/covoar/ExecutableInfo.h
> +++ b/tester/covoar/ExecutableInfo.h
> @@ -11,6 +11,10 @@
> #include <stdint.h>
> #include <string>
>
> +#include <rld-dwarf.h>
> +#include <rld-files.h>
> +#include <rld-symbols.h>
> +
> #include "CoverageMapBase.h"
> #include "SymbolTable.h"
>
> @@ -67,14 +71,14 @@ namespace Coverage {
> *
> * @return Returns the executable's file name
> */
> - const std::string& getFileName( void ) const;
> + const std::string getFileName( void ) const;
>
> /*!
> * This method returns the library name associated with the
> executable.
> *
> * @return Returns the executable's library name
> */
> - const std::string& getLibraryName( void ) const;
> + const std::string getLibraryName( void ) const;
>
> /*!
> * This method returns the load address of the dynamic library
> @@ -88,7 +92,7 @@ namespace Coverage {
> *
> * @return Returns a pointer to the symbol table.
> */
> - SymbolTable* getSymbolTable( void ) const;
> + SymbolTable* getSymbolTable( void );
>
> /*!
> * This method creates a coverage map for the specified symbol.
> @@ -107,6 +111,15 @@ namespace Coverage {
> uint32_t highAddress
> );
>
> + /*!
> + * This method gets the source location, the file and line number
> given an
> + * address.
> + */
> + void getSourceAndLine(
> + const unsigned int address,
> + std::string& location
> + );
> +
> /*!
> * This method indicates whether a dynamic library has been
> * associated with the executable.
> @@ -132,15 +145,25 @@ namespace Coverage {
> private:
>
> /*!
> - * This map associates a symbol with its coverage map.
> + * The ELF executable.
> */
> - typedef std::map<std::string, CoverageMapBase *> coverageMaps_t;
> - coverageMaps_t coverageMaps;
> + rld::files::object executable;
>
> /*!
> - * This member variable contains the name of the executable.
> + * The DWARF data to the ELF executable.
> + */
> + rld::dwarf::file debug;
> +
> + /*!
> + * The executable's symbol table.
> + */
> + rld::symbols::table symbols;
> +
> + /*!
> + * This map associates a symbol with its coverage map.
> */
> - std::string executableName;
> + typedef std::map<std::string, CoverageMapBase *> CoverageMaps;
> + CoverageMaps coverageMaps;
>
> /*!
> * This member variable contains the name of a dynamic library
> @@ -158,7 +181,7 @@ namespace Coverage {
> * This member variable contains a pointer to the symbol table
> * of the executable or library.
> */
> - SymbolTable* theSymbolTable;
> + SymbolTable theSymbolTable;
>
> };
> }
> diff --git a/tester/covoar/covoar.cc b/tester/covoar/covoar.cc
> index 5c87402..09c86c2 100644
> --- a/tester/covoar/covoar.cc
> +++ b/tester/covoar/covoar.cc
> @@ -186,7 +186,7 @@ int main(
> Coverage::ExecutableInfo* executableInfo = NULL;
> std::string executableExtension = "exe";
> std::string coverageExtension = "cov";
> - Coverage::CoverageFormats_t coverageFormat;
> + Coverage::CoverageFormats_t coverageFormat =
> Coverage::COVERAGE_FORMAT_QEMU;
> Coverage::CoverageReaderBase* coverageReader = NULL;
> char* executable = NULL;
> const char* explanations = NULL;
> diff --git a/tester/covoar/wscript b/tester/covoar/wscript
> index c0270d8..55d5ec9 100644
> --- a/tester/covoar/wscript
> +++ b/tester/covoar/wscript
> @@ -70,7 +70,7 @@ def build(bld):
> #
> # The list of modules.
> #
> - modules = ['rld', 'elf', 'iberty']
> + modules = ['rld', 'dwarf', 'elf', 'iberty']
>
> bld.stlib(target = 'ccovoar',
> source = ['app_common.cc',
> --
> 2.15.1
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20180505/d540d05f/attachment-0002.html>
More information about the devel
mailing list