A debugging problem (long)

Gautam Makani makani at marque.mu.edu
Wed Feb 22 14:44:00 AEST 1989


I was'nt too sure whether this was a UNIX or a C problem hence the
cross-posting.
I have a piece of code to read in line entries from an object file
and filter out some information. I get an EMT (core dump) and cannot
figure out why.

The problem happens when I access a particular part of a struct, *but*
 i) I can print out the constituent data in that area. 
 ii) Using "sdb" (UNIX debugger), I can access (look at) the variable.
 iii) Further, what puzzles me is that this happens the *second* time through a 
      loop.I know that seems stupid ...

 I would appreciate it if someone tells me what's going on. 
 The struct I'm looking at is
struct lineno
{
	union
	{
		long	l_symndx ;
		long	l_paddr ;
	}		l_addr ;
	unsigned short	l_lnno ;	
} ;
#define LINENO struct lineno

The problem comes when I access l_symndx as
       tmplptr->l_addr.l_symndx in any form (in an assignment, printf etc)
Further on this machine,(3b15) sizeof(int) = sizeof(long) (if that helps)

Code segement follows:
----------------------
    for (i = 0, lindex = 0; i <= nlentries ;i++ )
    {
       tmplptr = (LINENO *)lineptr;
       tmp = (char * ) tmplptr;
       printf("tmplptr.l_lnno = %lx\n", (long )tmplptr[0].l_lnno);
       for (ret = 0; ret < 6; ret ++)
       {
         printf("%x ", (char )*tmp);
         tmp++;
       }
       printf("\n");
       printf("symndx = %lx\n",tmplptr->l_addr.l_symndx );
       lineptr = (char *)((long) lineptr + LINESZ);
     }
Program run follows: 
--------------------
c$ tline tline
tmplptr.l_lnno = 0
0 0 0 b7 0 0
symndx = b7
tmplptr.l_lnno = 1
80 80 1	1d 0 1
EMT trap - core	dumped

Sdb session follows:
---------------------
c$ sdb tline
0x8080030b in line:88:	      printf("symndx = %lx\n",tmplptr->l_addr.l_symndx );
*b
line:88	b
*R tline
tmplptr.l_lnno = 0
0 0 0 b7 0 0
Breakpoint at
line:88:	printf("symndx = %lx\n",tmplptr->l_addr.l_symndx );
*c
symndx = b7
tmplptr.l_lnno = 1
80 80 1	1d 0 1
Breakpoint at
line:88:	printf("symndx = %lx\n",tmplptr->l_addr.l_symndx );
*tmplptr->l_addr.l_symndx/lx
0x8080011d
*s
EMT (7)	(sig 7)
0x8080030b in line:88:	      printf("symndx = %lx\n",tmplptr->l_addr.l_symndx );
*q
-------------
I realize this is utilizing precious bandwidth. Please reply by e-mail
and thanks in advance.

----------------------------------------------------------------------
Makani Gautam
Department of MSCS           email : makani at marque.mu.edu 
Marquette University               { uwvax!uwmcsd1 | uunet }!marque!makani
----------------------------------------------------------------------



More information about the Comp.unix.questions mailing list