From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 5094 invoked by alias); 9 Sep 2002 18:45:42 -0000 Mailing-List: contact gdb-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-owner@sources.redhat.com Received: (qmail 5087 invoked from network); 9 Sep 2002 18:45:40 -0000 Received: from unknown (HELO localhost.redhat.com) (216.138.202.10) by sources.redhat.com with SMTP; 9 Sep 2002 18:45:40 -0000 Received: from ges.redhat.com (localhost [127.0.0.1]) by localhost.redhat.com (Postfix) with ESMTP id 40F8B3F26; Mon, 9 Sep 2002 14:45:38 -0400 (EDT) Message-ID: <3D7CEC52.3000504@ges.redhat.com> Date: Mon, 09 Sep 2002 11:45:00 -0000 From: Andrew Cagney User-Agent: Mozilla/5.0 (X11; U; NetBSD macppc; en-US; rv:1.0.0) Gecko/20020824 X-Accept-Language: en-us, en MIME-Version: 1.0 To: kraftche@cae.wisc.edu Cc: gdb@sources.redhat.com Subject: Re: environment for 'shell' command References: <3D359FDE.4453EA90@cae.wisc.edu> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-SW-Source: 2002-09/txt/msg00057.txt.bz2 > Hi, > > I would like the ability to pass the file name and line number of the > source corresponding to the selected stack frame to a program started > via the 'shell' command. I could not find any way to do this in gdb. > If there is a way to do this, please let me know (and disregard the rest > of this message.) I decided to add this functionality but I am > unfimiliar with the internal workings of gdb. The following is a > description of what I did to implement this. I'd really appreciate any > suggestions on better ways to implement this, error conditions I'm not > handling, etc. Off hand I can think of two ways to handle this: -- extend what you've proposed by including commands to explicitly manipulate the exported environment, vis: (gdb) command-to-set-shell-env VARIABLE VALUE (gdb) shell printenv VARIABLE VARIABLE=VALUE (gdb) where VALUE is something that GDB could evaluate. As I suspect you discovered, there currently isn't a mechanism for refering to the current SAL from GDB's command line. I think it is better to have explicit commands to manipulate the exported environment as that will help make things more transparent. A few defaults wouldn't hurt of course. -- extend ``shell'' or add a new command that lets expressions that GDB evaluates be passed down to the shell. That way, something like: (gdb) eval shell $frame.file $frame.line would pass down the values you need. (No $frame.file and $frame.line do not exist :-). Hmm, it appears that ``eval'' isn't taken. Anyone? (It's time to reach a decision on $frame, $gdbframe $gdb.frame and get that committed :-) Andrew > The simplest way I could come up with to do this is to put the values in > environmental variables immediately before executing the command. > Specifically, setting gdb_stack_dir, gdb_stack_file, and gdb_stack_line > to the values from a struct symtab_and_line. I use this for defining > things like a 'view' command that highlights the current location in the > source in a text editor: > define view > shell if [ x$gdb_stack_file != x ]; then \ > nc -line $gdb_stack_line $gdb_stack_dir$gdb_stack_file; \ > fi > end > > I added the following function to stack.c to get a symtab_and_line > struct for the selected frame: > > /* Get a symtab_and_line for the selected stack frame. */ > struct symtab_and_line > find_selected_line (void) > { > struct symtab_and_line sal; > INIT_SAL( &sal ); > if( selected_frame != NULL ) > sal = find_pc_line(selected_frame->pc, > selected_frame->next > && !selected_frame->next->signal_handler_caller > && !frame_in_dummy (selected_frame->next)); > return sal; > } > > > I added a function 'set_shell_environment' to cli/cli-cmds.c and added > calls to that function in 'shell_escape'. > > #define SHELL_ENV "gdb_stack_" > > static void > set_shell_environment() > { > char buffer[16]; > struct symtab_and_line sal = find_selected_line(); > > unsetenv (SHELL_ENV "file"); > unsetenv (SHELL_ENV "dir"); > unsetenv (SHELL_ENV "line"); > > if (sal.symtab && sal.symtab->filename && sal.symtab->dirname) > { > sprintf (buffer, "%d", sal.line); > setenv (SHELL_ENV "line", buffer, 1); > setenv (SHLLL_ENV "dir", sal.symtab->dirname, 1); > setenv (SHELL_ENV "file", sal.symtab->filename, 1); > } > } > > thanks, > > -- Jason Kraftcheck