Xref: utzoo comp.unix.questions:11826 comp.lang.c:16412 Path: utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!csd4.milw.wisc.edu!uwmcsd1!marque!makani From: makani@marque.mu.edu (Gautam Makani) Newsgroups: comp.unix.questions,comp.lang.c Subject: A debugging problem (long) Summary: why do I get a core dump ? Message-ID: <382@marque.mu.edu> Date: 22 Feb 89 04:44:00 GMT Reply-To: makani@marque.UUCP (Gautam Makani) Organization: Marquette University, Milwaukee, WI Lines: 87 References: Distribution:usa Keywords:access structure member, core dump 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@marque.mu.edu Marquette University { uwvax!uwmcsd1 | uunet }!marque!makani ----------------------------------------------------------------------