From owner-freebsd-current@FreeBSD.ORG Wed Apr 6 17:16:32 2011 Return-Path: Delivered-To: current@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 15292106566C; Wed, 6 Apr 2011 17:16:32 +0000 (UTC) (envelope-from julian@freebsd.org) Received: from vps1.elischer.org (vps1.elischer.org [204.109.63.16]) by mx1.freebsd.org (Postfix) with ESMTP id BF5408FC16; Wed, 6 Apr 2011 17:16:31 +0000 (UTC) Received: from julian-mac.elischer.org (home-nat.elischer.org [67.100.89.137]) (authenticated bits=0) by vps1.elischer.org (8.14.4/8.14.4) with ESMTP id p36HGTqY064738 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Wed, 6 Apr 2011 10:16:30 -0700 (PDT) (envelope-from julian@freebsd.org) Message-ID: <4D9CA00C.20307@freebsd.org> Date: Wed, 06 Apr 2011 10:17:00 -0700 From: Julian Elischer User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.4; en-US; rv:1.9.2.15) Gecko/20110303 Thunderbird/3.1.9 MIME-Version: 1.0 To: John Baldwin References: <4D9A4CE5.5090900@freebsd.org> <4D9B7C92.6030901@freebsd.org> <201104060845.11771.jhb@freebsd.org> In-Reply-To: <201104060845.11771.jhb@freebsd.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: freebsd-current@freebsd.org, Justin Hibbits , Navdeep Parhar , FreeBSD Current Subject: Re: KGDB stack traces in the kernel. X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 06 Apr 2011 17:16:32 -0000 On 4/6/11 5:45 AM, John Baldwin wrote: > On Tuesday, April 05, 2011 4:35:44 pm Navdeep Parhar wrote: >> On Tue, Apr 5, 2011 at 1:33 PM, Julian Elischer wrote: >>> On 4/4/11 6:04 PM, Justin Hibbits wrote: >>> >> What does ddb do? It always seems to get this stuff correct. > ddb knows to stop when it gets to a non-kernel address, and it uses string > compares on function names to identify trap frames. For example in > sys/amd64/amd64/db_trace.c: > > > if (strcmp(name, "calltrap") == 0 || > strcmp(name, "fork_trampoline") == 0 || > strcmp(name, "nmi_calltrap") == 0 || > strcmp(name, "Xdblfault") == 0) > frame_type = TRAP; > > Hah, kgdb just needs to be updated (this is from trgt_amd64.c): > > const struct frame_unwind * > kgdb_trgt_trapframe_sniffer(struct frame_info *next_frame) > { > char *pname; > CORE_ADDR pc; > > pc = frame_pc_unwind(next_frame); > pname = NULL; > find_pc_partial_function(pc,&pname, NULL, NULL); > if (pname == NULL) > return (NULL); > if (strcmp(pname, "calltrap") == 0 || > strcmp(pname, "nmi_calltrap") == 0 || > (pname[0] == 'X'&& pname[1] != '_')) > return (&kgdb_trgt_trapframe_unwind); > /* printf("%s: %lx =%s\n", __func__, pc, pname); */ > return (NULL); > } > I'll give that a try > Can probably just add 'fork_trampoline' to that conditional. I think i386 > needs a similar fix in kgdb. Not sure about other architectures: > > Index: trgt_amd64.c > =================================================================== > --- trgt_amd64.c (revision 220190) > +++ trgt_amd64.c (working copy) > @@ -184,6 +184,7 @@ > if (pname == NULL) > return (NULL); > if (strcmp(pname, "calltrap") == 0 || > + strcmp(pname, "fork_trampoline") == 0 || > strcmp(pname, "nmi_calltrap") == 0 || > (pname[0] == 'X'&& pname[1] != '_')) > return (&kgdb_trgt_trapframe_unwind); > Index: trgt_i386.c > =================================================================== > --- trgt_i386.c (revision 220190) > +++ trgt_i386.c (working copy) > @@ -374,6 +374,7 @@ > if (strcmp(pname, "dblfault_handler") == 0) > return (&kgdb_trgt_dblfault_unwind); > if (strcmp(pname, "calltrap") == 0 || > + strcmp(pname, "fork_trampoline") == 0 || > (pname[0] == 'X'&& pname[1] != '_')) > return (&kgdb_trgt_trapframe_unwind); > /* printf("%s: %llx =%s\n", __func__, pc, pname); */ >