Author: sewardj Date: 2008-02-07 12:04:25 +0000 (Thu, 07 Feb 2008) New Revision: 7377
Log: describe_addr: make use of new function VG_(get_datasym_and_offset), mostly for the purposes of testing the latter. Modified: branches/DATASYMS/memcheck/mc_main.c Modified: branches/DATASYMS/memcheck/mc_main.c =================================================================== --- branches/DATASYMS/memcheck/mc_main.c 2008-02-07 12:02:12 UTC (rev 7376) +++ branches/DATASYMS/memcheck/mc_main.c 2008-02-07 12:04:25 UTC (rev 7377) @@ -2628,9 +2628,10 @@ enum { Addr_Undescribed, // as-yet unclassified Addr_Unknown, // classification yielded nothing useful + Addr_Block, // in malloc'd/free'd block Addr_Stack, // on a thread's stack - Addr_Block, // in malloc'd/free'd block - Addr_GlobalData, // in a global data sym + Addr_DataSym, // in a global data sym + Addr_Variable, // variable described by the debug info Addr_SectKind // last-ditch classification attempt } AddrTag; @@ -2665,8 +2666,13 @@ struct { Char name[64]; OffT offset; - } GlobalData; + } DataSym; + // Is described by Dwarf debug info. Arbitrary string. + struct { + Char descr[64]; + } Variable; + // Could only narrow it down to be the PLT/GOT/etc of a given // object. Better than nothing, perhaps. struct { @@ -2850,17 +2856,22 @@ break; } - case Addr_GlobalData: + case Addr_DataSym: VG_(message)(Vg_UserMsg, "%sAddress 0x%llx is %llu bytes " - "inside global var \"%t\"%s", + "inside data symbol \"%t\"%s", xpre, (ULong)a, - (ULong)ai->Addr.GlobalData.offset, - ai->Addr.GlobalData.name, + (ULong)ai->Addr.DataSym.offset, + ai->Addr.DataSym.name, xpost); break; + case Addr_Variable: + VG_(message)(Vg_UserMsg, + "%s%s%s", xpre, ai->Addr.Variable.descr, xpost); + break; + case Addr_SectKind: VG_(message)(Vg_UserMsg, "%sAddress 0x%llx is in the %t segment of %t%s", @@ -3359,7 +3370,11 @@ /* Describe an address as best you can, for error messages, putting the result in ai. */ -static void describe_addr ( Addr a, AddrInfo* ai ) +static void describe_addr ( Addr a, + Addr ip_at_error, + Addr sp_at_error, + Addr fp_at_error, + /*OUT*/AddrInfo* ai ) { MC_Chunk* mc; ThreadId tid; @@ -3372,15 +3387,6 @@ if (client_perm_maybe_describe( a, ai )) { return; } - /* Perhaps it's on a thread's stack? */ - VG_(thread_stack_reset_iter)(); - while ( VG_(thread_stack_next)(&tid, &stack_min, &stack_max) ) { - if (stack_min <= a && a <= stack_max) { - ai->tag = Addr_Stack; - ai->Addr.Stack.tid = tid; - return; - } - } /* Search for a recently freed block which might bracket it. */ mc = MC_(get_freed_list_head)(); while (mc) { @@ -3408,17 +3414,40 @@ return; } } - /* Perhaps it's in global data? */ - VG_(memset)( &ai->Addr.GlobalData.name, 0, sizeof(ai->Addr.GlobalData.name)); - if (VG_(get_dataname_and_offset)( - a, &ai->Addr.GlobalData.name[0], - sizeof(ai->Addr.GlobalData.name)-1, - &ai->Addr.GlobalData.offset )) { - ai->tag = Addr_GlobalData; - tl_assert( ai->Addr.GlobalData.name - [ sizeof(ai->Addr.GlobalData.name)-1 ] == 0); + /* Perhaps the variable type/location data describes it? */ + VG_(memset)( &ai->Addr.Variable.descr, + 0, sizeof(ai->Addr.Variable.descr)); + if (VG_(get_data_description)( + a, ip_at_error, sp_at_error, fp_at_error, + &ai->Addr.Variable.descr[0], + sizeof(ai->Addr.Variable.descr)-1 )) { + ai->tag = Addr_Variable; + tl_assert( ai->Addr.Variable.descr + [ sizeof(ai->Addr.Variable.descr)-1 ] == 0); return; } + /* Have a look at the low level data symbols - perhaps it's in + there. */ + VG_(memset)( &ai->Addr.DataSym.name, + 0, sizeof(ai->Addr.DataSym.name)); + if (VG_(get_datasym_and_offset)( + a, &ai->Addr.DataSym.name[0], + sizeof(ai->Addr.DataSym.name)-1, + &ai->Addr.DataSym.offset )) { + ai->tag = Addr_DataSym; + tl_assert( ai->Addr.DataSym.name + [ sizeof(ai->Addr.DataSym.name)-1 ] == 0); + return; + } + /* Perhaps it's on a thread's stack? */ + VG_(thread_stack_reset_iter)(); + while ( VG_(thread_stack_next)(&tid, &stack_min, &stack_max) ) { + if (stack_min <= a && a <= stack_max) { + ai->tag = Addr_Stack; + ai->Addr.Stack.tid = tid; + return; + } + } /* last ditch attempt at classification */ tl_assert( sizeof(ai->Addr.SectKind.objname) > 4 ); VG_(memset)( &ai->Addr.SectKind.objname, @@ -3443,6 +3472,11 @@ { MC_Error* extra = VG_(get_error_extra)(err); + ThreadId tid = VG_(get_error_tid)(err); + Addr ip_at_error = VG_(get_IP)( tid ); + Addr sp_at_error = VG_(get_SP)( tid ); + Addr fp_at_error = VG_(get_FP)( tid ); + switch (VG_(get_error_kind)(err)) { // These ones don't have addresses associated with them, and so don't // need any updating. @@ -3459,22 +3493,33 @@ // These ones always involve a memory address. case Err_Addr: - describe_addr ( VG_(get_error_address)(err), &extra->Err.Addr.ai ); + describe_addr ( VG_(get_error_address)(err), + ip_at_error, sp_at_error, fp_at_error, + &extra->Err.Addr.ai ); return sizeof(MC_Error); case Err_MemParam: - describe_addr ( VG_(get_error_address)(err), &extra->Err.MemParam.ai ); + describe_addr ( VG_(get_error_address)(err), + ip_at_error, sp_at_error, fp_at_error, + &extra->Err.MemParam.ai ); return sizeof(MC_Error); case Err_Jump: - describe_addr ( VG_(get_error_address)(err), &extra->Err.Jump.ai ); + describe_addr ( VG_(get_error_address)(err), + ip_at_error, sp_at_error, fp_at_error, + &extra->Err.Jump.ai ); return sizeof(MC_Error); case Err_User: - describe_addr ( VG_(get_error_address)(err), &extra->Err.User.ai ); + describe_addr ( VG_(get_error_address)(err), + ip_at_error, sp_at_error, fp_at_error, + &extra->Err.User.ai ); return sizeof(MC_Error); case Err_Free: - describe_addr ( VG_(get_error_address)(err), &extra->Err.Free.ai ); + describe_addr ( VG_(get_error_address)(err), + ip_at_error, sp_at_error, fp_at_error, + &extra->Err.Free.ai ); return sizeof(MC_Error); case Err_IllegalMempool: describe_addr ( VG_(get_error_address)(err), + ip_at_error, sp_at_error, fp_at_error, &extra->Err.IllegalMempool.ai ); return sizeof(MC_Error); ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ Valgrind-developers mailing list Valgrind-developers@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/valgrind-developers