From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 7827 invoked by alias); 17 Jul 2002 16:50:05 -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 7303 invoked from network); 17 Jul 2002 16:48:48 -0000 Received: from unknown (HELO cae.wisc.edu) (144.92.240.30) by sources.redhat.com with SMTP; 17 Jul 2002 16:48:48 -0000 Received: from cae.wisc.edu (rincewind.neep.wisc.edu [128.104.187.108]) by cae.wisc.edu (8.9.1/8.9.0) with ESMTP id LAA09128 for ; Wed, 17 Jul 2002 11:48:47 -0500 (CDT) Message-ID: <3D359FDE.4453EA90@cae.wisc.edu> Date: Wed, 17 Jul 2002 09:50:00 -0000 From: Jason Kraftcheck Reply-To: kraftche@cae.wisc.edu Organization: University of Wisconsin (http://www.wisc.edu) X-Accept-Language: en MIME-Version: 1.0 To: gdb@sources.redhat.com Subject: environment for 'shell' command Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-SW-Source: 2002-07/txt/msg00169.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. 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