From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 5349 invoked by alias); 8 Mar 2004 23:10:14 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 5333 invoked from network); 8 Mar 2004 23:10:11 -0000 Received: from unknown (HELO mx1.redhat.com) (66.187.233.31) by sources.redhat.com with SMTP; 8 Mar 2004 23:10:11 -0000 Received: from int-mx2.corp.redhat.com (nat-pool-rdu-dmz.redhat.com [172.16.52.200] (may be forged)) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i28NA9ST001536 for ; Mon, 8 Mar 2004 18:10:10 -0500 Received: from potter.sfbay.redhat.com (potter.sfbay.redhat.com [172.16.27.15]) by int-mx2.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i28N9xM00957; Mon, 8 Mar 2004 18:10:00 -0500 Received: from redhat.com (dhcp-172-16-25-160.sfbay.redhat.com [172.16.25.160]) by potter.sfbay.redhat.com (8.11.6/8.11.6) with ESMTP id i28N9wR09584; Mon, 8 Mar 2004 15:09:58 -0800 Message-ID: <404CFD46.7010003@redhat.com> Date: Fri, 19 Mar 2004 00:09:00 -0000 From: Michael Snyder Organization: Red Hat, Inc. User-Agent: Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.4) Gecko/20030922 MIME-Version: 1.0 To: jim.houston@comcast.net CC: gdb-patches@sources.redhat.com Subject: Re: [patch] thread info - automatic skip frames References: In-Reply-To: Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-RedHat-Spam-Score: -4.9 X-SW-Source: 2004-03/txt/msg00183.txt.bz2 Message-ID: <20040319000900.HIz7DKbzM_jxpyy69pxIMizvf2Dr78tDMxhbNGl4Gg0@z> Jim Houston wrote: > Hi Everyone, > > I developed this patch to support using kgdb on the > x86-64 linux kernel. > > The patch adds an option to gdb to skip over boring frames > in the "thread info" results. This is useful when most of > the threads are stopped in the context switch code. It lets > you see the frame which shows why the the thread blocked. > > Use: > set skip-frame thread_return,schedule_timeout Wow -- interesting idea! I'd like to see some discussion about the user interface. I think it's clever to let the user decide what functions are "un-interesting" -- and if I were the user, I'd probably think of more un-interesting functions as I went along. I'd like to be able to add to the list, rather than enter the whole thing again from scratch. And that implies a separate command to clear it. I also wonder whether the same idea might be useful for backtrace and "frame". When I debug, I often have to go up the stack a ways before finding something interesting. That can be added separately, but it would be nice to get the common functionality right from the beginning. Have you thought about other ways to distinguish "uninteresting" functions automatically, without imposing on the user to list them? Perhaps (under some circumstances, anyway), any function from a shared library might be uninteresting? Or any function lacking debug information? > > --- old/gdb-6.0/gdb/thread.c 2004-01-06 12:34:14.786496352 -0500 > +++ new/gdb-6.0/gdb/thread.c 2004-01-06 12:34:28.804365312 -0500 > @@ -404,6 +404,43 @@ > } > } > > +/* > + * When using gdb as a kernel debugger, its really boring to > + * see every thread is blocked in schedule. By setting a > + * list of functions with "set skip-frame schedule,thread_return" > + * we can display the frame that called into the scheduler. > + */ > +static char *skip_frame_string; > + > +int > +skip_frame(struct frame_info *fi) > +{ > + struct minimal_symbol *msym; > + CORE_ADDR pc; > + char *name; > + char *s, *r; > + int n; > + > + pc = get_frame_pc (fi); > + msym = lookup_minimal_symbol_by_pc_section(pc, NULL); > + if (!msym) > + return 0; > + name = SYMBOL_LINKAGE_NAME(msym); > + > + for (s = skip_frame_string; s && *s ; ) { > + if ((r = strchr(s, ','))) > + n = r - s - 1; > + else > + n = strlen(s); > + if (n && strncmp(s, name, n) == 0) > + return 1; > + if (!r) > + break; > + s = r + 1; > + } > + return 0; > +} > + > /* Print information about currently known threads > > * Note: this has the drawback that it _really_ switches > @@ -416,7 +453,7 @@ > { > struct thread_info *tp; > ptid_t current_ptid; > - struct frame_info *cur_frame; > + struct frame_info *cur_frame, *fi; > int saved_frame_level = frame_relative_level (get_selected_frame ()); > int counter; > char *extra_info; > @@ -448,6 +485,18 @@ > puts_filtered (" "); > > switch_to_thread (tp->ptid); > + > + if (skip_frame_string) { > + /* skip up the stack to an interesting frame. */ > + fi = get_selected_frame (); > + while (fi) { > + if (!skip_frame(fi)) > + break; > + fi = get_prev_frame(fi); > + if (fi) > + select_frame(fi); > + } > + } > print_stack_frame (get_selected_frame (), -1, 0); > } > > @@ -740,4 +789,12 @@ > > if (!xdb_commands) > add_com_alias ("t", "thread", class_run, 1); > + > + add_show_from_set (add_set_cmd ("skip-frame", class_obscure, > + var_string_noescape, (char *)&skip_frame_string, "\ > +Set list of functions to skip when choosing the frame to display\n\ > +for a info-thread command. When gdb is used for kernel debug this option\n\ > +allows the frame which calls the scheduler to be displayed rather than\n\ > +having all blocked threads showing the same function in the scheduler.", > + &setlist), &showlist); > } >