|
From: <sv...@va...> - 2008-02-07 12:04:25
|
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);
|