e2ceb91cc328e5add4606977b3596fa79a2d4eea
1 /* List lines of source files for GDB, the GNU debugger.
2 Copyright 1986, 1987, 1988, 1989, 1991, 1992, 1993, 1994, 1995
3 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
23 #include "expression.h"
29 #include <sys/types.h>
30 #include "gdb_string.h"
31 #include <sys/param.h>
44 /* Prototypes for local functions. */
46 static int open_source_file
PARAMS ((struct symtab
*));
48 static int get_filename_and_charpos
PARAMS ((struct symtab
*, char **));
50 static void reverse_search_command
PARAMS ((char *, int));
52 static void forward_search_command
PARAMS ((char *, int));
54 static void line_info
PARAMS ((char *, int));
56 static void list_command
PARAMS ((char *, int));
58 static void ambiguous_line_spec
PARAMS ((struct symtabs_and_lines
*));
60 static void source_info
PARAMS ((char *, int));
62 static void show_directories
PARAMS ((char *, int));
64 static void find_source_lines
PARAMS ((struct symtab
*, int));
66 /* If we use this declaration, it breaks because of fucking ANSI "const" stuff
67 on some systems. We just have to not declare it at all, have it default
68 to int, and possibly botch on a few systems. Thanks, ANSIholes... */
69 /* extern char *strstr(); */
71 /* Path of directories to search for source files.
72 Same format as the PATH environment variable's value. */
76 /* Symtab of default file for listing lines of. */
78 struct symtab
*current_source_symtab
;
80 /* Default next line to list. */
82 int current_source_line
;
84 /* Default number of lines to print with commands like "list".
85 This is based on guessing how many long (i.e. more than chars_per_line
86 characters) lines there will be. To be completely correct, "list"
87 and friends should be rewritten to count characters and see where
88 things are wrapping, but that would be a fair amount of work. */
90 int lines_to_list
= 10;
92 /* Line number of last line printed. Default for various commands.
93 current_source_line is usually, but not always, the same as this. */
95 static int last_line_listed
;
97 /* First line number listed by last listing command. */
99 static int first_line_listed
;
102 /* Set the source file default for the "list" command to be S.
104 If S is NULL, and we don't have a default, find one. This
105 should only be called when the user actually tries to use the
106 default, since we produce an error if we can't find a reasonable
107 default. Also, since this can cause symbols to be read, doing it
108 before we need to would make things slower than necessary. */
111 select_source_symtab (s
)
112 register struct symtab
*s
;
114 struct symtabs_and_lines sals
;
115 struct symtab_and_line sal
;
116 struct partial_symtab
*ps
;
117 struct partial_symtab
*cs_pst
= 0;
122 current_source_symtab
= s
;
123 current_source_line
= 1;
127 if (current_source_symtab
)
130 /* Make the default place to list be the function `main'
132 if (lookup_symbol ("main", 0, VAR_NAMESPACE
, 0, NULL
))
134 sals
= decode_line_spec ("main", 1);
137 current_source_symtab
= sal
.symtab
;
138 current_source_line
= max (sal
.line
- (lines_to_list
- 1), 1);
139 if (current_source_symtab
)
143 /* All right; find the last file in the symtab list (ignoring .h's). */
145 current_source_line
= 1;
147 for (ofp
= object_files
; ofp
!= NULL
; ofp
= ofp
-> next
)
149 for (s
= ofp
-> symtabs
; s
; s
= s
->next
)
151 char *name
= s
-> filename
;
152 int len
= strlen (name
);
153 if (! (len
> 2 && (STREQ (&name
[len
- 2], ".h"))))
155 current_source_symtab
= s
;
159 if (current_source_symtab
)
162 /* Howabout the partial symbol tables? */
164 for (ofp
= object_files
; ofp
!= NULL
; ofp
= ofp
-> next
)
166 for (ps
= ofp
-> psymtabs
; ps
!= NULL
; ps
= ps
-> next
)
168 char *name
= ps
-> filename
;
169 int len
= strlen (name
);
170 if (! (len
> 2 && (STREQ (&name
[len
- 2], ".h"))))
178 if (cs_pst
-> readin
)
180 fatal ("Internal: select_source_symtab: readin pst found and no symtabs.");
184 current_source_symtab
= PSYMTAB_TO_SYMTAB (cs_pst
);
188 error ("Can't find a default source file");
192 show_directories (ignore
, from_tty
)
196 puts_filtered ("Source directories searched: ");
197 puts_filtered (source_path
);
198 puts_filtered ("\n");
201 /* Forget what we learned about line positions in source files, and
202 which directories contain them; must check again now since files
203 may be found in a different directory now. */
206 forget_cached_source_info ()
208 register struct symtab
*s
;
209 register struct objfile
*objfile
;
211 for (objfile
= object_files
; objfile
!= NULL
; objfile
= objfile
-> next
)
213 for (s
= objfile
-> symtabs
; s
!= NULL
; s
= s
-> next
)
215 if (s
-> line_charpos
!= NULL
)
217 mfree (objfile
-> md
, s
-> line_charpos
);
218 s
-> line_charpos
= NULL
;
220 if (s
-> fullname
!= NULL
)
222 mfree (objfile
-> md
, s
-> fullname
);
223 s
-> fullname
= NULL
;
234 sprintf (buf
, "$cdir%c$cwd", DIRNAME_SEPARATOR
);
235 source_path
= strsave (buf
);
236 forget_cached_source_info ();
239 /* Add zero or more directories to the front of the source path. */
242 directory_command (dirname
, from_tty
)
247 /* FIXME, this goes to "delete dir"... */
250 if (query ("Reinitialize source path to empty? "))
257 mod_path (dirname
, &source_path
);
259 show_directories ((char *)0, from_tty
);
260 forget_cached_source_info ();
263 /* Add zero or more directories to the front of an arbitrary path. */
266 mod_path (dirname
, which_path
)
270 char *old
= *which_path
;
276 dirname
= strsave (dirname
);
277 make_cleanup (free
, dirname
);
281 char *name
= dirname
;
286 char *separator
= strchr (name
, DIRNAME_SEPARATOR
);
287 char *space
= strchr (name
, ' ');
288 char *tab
= strchr (name
, '\t');
290 if (separator
== 0 && space
== 0 && tab
== 0)
291 p
= dirname
= name
+ strlen (name
);
295 if (separator
!= 0 && (p
== 0 || separator
< p
))
297 if (space
!= 0 && (p
== 0 || space
< p
))
299 if (tab
!= 0 && (p
== 0 || tab
< p
))
302 while (*dirname
== DIRNAME_SEPARATOR
310 /* Sigh. "foo/" => "foo" */
318 /* "." => getwd (). */
319 name
= current_directory
;
322 else if (SLASH_P (p
[-2]))
332 /* "...foo/." => "...foo". */
343 name
= tilde_expand (name
);
344 else if (!SLASH_P (name
[0]) && name
[0] != '$')
345 name
= concat (current_directory
, SLASH_STRING
, name
, NULL
);
347 name
= savestring (name
, p
- name
);
348 make_cleanup (free
, name
);
350 /* Unless it's a variable, check existence. */
351 if (name
[0] != '$') {
352 /* These are warnings, not errors, since we don't want a
353 non-existent directory in a .gdbinit file to stop processing
354 of the .gdbinit file.
356 Whether they get added to the path is more debatable. Current
357 answer is yes, in case the user wants to go make the directory
358 or whatever. If the directory continues to not exist/not be
359 a directory/etc, then having them in the path should be
361 if (stat (name
, &st
) < 0)
363 int save_errno
= errno
;
364 fprintf_unfiltered (gdb_stderr
, "Warning: ");
365 print_sys_errmsg (name
, save_errno
);
367 else if ((st
.st_mode
& S_IFMT
) != S_IFDIR
)
368 warning ("%s is not a directory.", name
);
373 register unsigned int len
= strlen (name
);
378 if (!strncmp (p
, name
, len
)
379 && (p
[len
] == '\0' || p
[len
] == DIRNAME_SEPARATOR
))
381 /* Found it in the search path, remove old copy */
383 p
--; /* Back over leading separator */
384 if (prefix
> p
- *which_path
)
385 goto skip_dup
; /* Same dir twice in one cmd */
386 strcpy (p
, &p
[len
+1]); /* Copy from next \0 or : */
388 p
= strchr (p
, DIRNAME_SEPARATOR
);
398 tinybuf
[0] = DIRNAME_SEPARATOR
;
401 /* If we have already tacked on a name(s) in this command, be sure they stay on the front as we tack on some more. */
408 temp
= concat (old
, tinybuf
, name
, NULL
);
410 *which_path
= concat (temp
, "", &old
[prefix
], NULL
);
411 prefix
= strlen (temp
);
416 *which_path
= concat (name
, (old
[0] ? tinybuf
: old
), old
, NULL
);
417 prefix
= strlen (name
);
424 } while (*dirname
!= '\0');
429 source_info (ignore
, from_tty
)
433 register struct symtab
*s
= current_source_symtab
;
437 printf_filtered("No current source file.\n");
440 printf_filtered ("Current source file is %s\n", s
->filename
);
442 printf_filtered ("Compilation directory is %s\n", s
->dirname
);
444 printf_filtered ("Located in %s\n", s
->fullname
);
446 printf_filtered ("Contains %d line%s.\n", s
->nlines
,
447 s
->nlines
== 1 ? "" : "s");
449 printf_filtered("Source language is %s.\n", language_str (s
->language
));
454 /* Open a file named STRING, searching path PATH (dir names sep by some char)
455 using mode MODE and protection bits PROT in the calls to open.
457 If TRY_CWD_FIRST, try to open ./STRING before searching PATH.
458 (ie pretend the first element of PATH is "."). This also indicates
459 that a slash in STRING disables searching of the path (this is
460 so that "exec-file ./foo" or "symbol-file ./foo" insures that you
461 get that particular version of foo or an error message).
463 If FILENAMED_OPENED is non-null, set it to a newly allocated string naming
464 the actual file opened (this string will always start with a "/". We
465 have to take special pains to avoid doubling the "/" between the directory
466 and the file, sigh! Emacs gets confuzzed by this when we print the
469 If a file is found, return the descriptor.
470 Otherwise, return -1, with errno set for the last name we tried to open. */
472 /* >>>> This should only allow files of certain types,
473 >>>> eg executable, non-directory */
475 openp (path
, try_cwd_first
, string
, mode
, prot
, filename_opened
)
481 char **filename_opened
;
484 register char *filename
;
485 register char *p
, *p1
;
492 if (try_cwd_first
|| SLASH_P (string
[0]))
496 fd
= open (filename
, mode
, prot
);
499 for (i
= 0; string
[i
]; i
++)
500 if (SLASH_P(string
[0]))
505 while (string
[0] == '.' && SLASH_P (string
[1]))
508 alloclen
= strlen (path
) + strlen (string
) + 2;
509 filename
= (char *) alloca (alloclen
);
511 for (p
= path
; p
; p
= p1
? p1
+ 1 : 0)
513 p1
= (char *) strchr (p
, DIRNAME_SEPARATOR
);
519 if (len
== 4 && p
[0] == '$' && p
[1] == 'c'
520 && p
[2] == 'w' && p
[3] == 'd') {
521 /* Name is $cwd -- insert current directory name instead. */
524 /* First, realloc the filename buffer if too short. */
525 len
= strlen (current_directory
);
526 newlen
= len
+ strlen (string
) + 2;
527 if (newlen
> alloclen
) {
529 filename
= (char *) alloca (alloclen
);
531 strcpy (filename
, current_directory
);
533 /* Normal file name in path -- just use it. */
534 strncpy (filename
, p
, len
);
538 /* Remove trailing slashes */
539 while (len
> 0 && SLASH_P (filename
[len
-1]))
542 strcat (filename
+len
, SLASH_STRING
);
543 strcat (filename
, string
);
545 fd
= open (filename
, mode
);
553 *filename_opened
= (char *) 0;
554 else if (ROOTED_P (filename
))
555 *filename_opened
= savestring (filename
, strlen (filename
));
558 /* Beware the // my son, the Emacs barfs, the botch that catch... */
560 *filename_opened
= concat (current_directory
,
562 == current_directory
[strlen(current_directory
)-1]
568 /* This is a debugging hack that can go away when all combinations
569 of Mac and Unix names are handled reasonably. */
571 extern int debug_openp
;
575 printf("openp on %s, path %s mode %d prot %d\n returned %d",
576 string
, path
, mode
, prot
, fd
);
577 if (*filename_opened
)
578 printf(" (filename is %s)", *filename_opened
);
587 /* Open a source file given a symtab S. Returns a file descriptor or
588 negative number for error. */
594 char *path
= source_path
;
599 /* Quick way out if we already know its full name */
602 result
= open (s
->fullname
, O_RDONLY
);
605 /* Didn't work -- free old one, try again. */
606 mfree (s
->objfile
->md
, s
->fullname
);
610 if (s
->dirname
!= NULL
)
612 /* Replace a path entry of $cdir with the compilation directory name */
614 /* We cast strstr's result in case an ANSIhole has made it const,
615 which produces a "required warning" when assigned to a nonconst. */
616 p
= (char *)strstr (source_path
, "$cdir");
617 if (p
&& (p
== path
|| p
[-1] == DIRNAME_SEPARATOR
)
618 && (p
[cdir_len
] == DIRNAME_SEPARATOR
|| p
[cdir_len
] == '\0'))
623 alloca (strlen (source_path
) + 1 + strlen (s
->dirname
) + 1);
624 len
= p
- source_path
;
625 strncpy (path
, source_path
, len
); /* Before $cdir */
626 strcpy (path
+ len
, s
->dirname
); /* new stuff */
627 strcat (path
+ len
, source_path
+ len
+ cdir_len
); /* After $cdir */
631 result
= openp (path
, 0, s
->filename
, O_RDONLY
, 0, &s
->fullname
);
634 /* Didn't work. Try using just the basename. */
635 p
= basename (s
->filename
);
636 if (p
!= s
->filename
)
637 result
= openp (path
, 0, p
, O_RDONLY
, 0, &s
->fullname
);
642 /* Didn't work. Try using just the MPW basename. */
643 p
= (char *) mpw_basename (s
->filename
);
644 if (p
!= s
->filename
)
645 result
= openp (path
, 0, p
, O_RDONLY
, 0, &s
->fullname
);
649 /* Didn't work. Try using the mixed Unix/MPW basename. */
650 p
= (char *) mpw_mixed_basename (s
->filename
);
651 if (p
!= s
->filename
)
652 result
= openp (path
, 0, p
, O_RDONLY
, 0, &s
->fullname
);
658 fullname
= s
->fullname
;
659 s
->fullname
= mstrsave (s
->objfile
->md
, s
->fullname
);
665 /* Return the path to the source file associated with symtab. Returns NULL
669 symtab_to_filename (s
)
677 /* If we've seen the file before, just return fullname. */
682 /* Try opening the file to setup fullname */
684 fd
= open_source_file (s
);
686 return s
->filename
; /* File not found. Just use short name */
688 /* Found the file. Cleanup and return the full name */
695 /* Create and initialize the table S->line_charpos that records
696 the positions of the lines in the source file, which is assumed
697 to be open on descriptor DESC.
698 All set S->nlines to the number of such lines. */
701 find_source_lines (s
, desc
)
706 register char *data
, *p
, *end
;
708 int lines_allocated
= 1000;
713 line_charpos
= (int *) xmmalloc (s
-> objfile
-> md
,
714 lines_allocated
* sizeof (int));
715 if (fstat (desc
, &st
) < 0)
716 perror_with_name (s
->filename
);
720 exec_mtime
= bfd_get_mtime(exec_bfd
);
721 if (exec_mtime
&& exec_mtime
< st
.st_mtime
)
722 printf_filtered ("Source file is more recent than executable.\n");
725 #ifdef LSEEK_NOT_LINEAR
729 /* Have to read it byte by byte to find out where the chars live */
731 line_charpos
[0] = tell(desc
);
733 while (myread(desc
, &c
, 1)>0)
737 if (nlines
== lines_allocated
)
739 lines_allocated
*= 2;
741 (int *) xmrealloc (s
-> objfile
-> md
, (char *) line_charpos
,
742 sizeof (int) * lines_allocated
);
744 line_charpos
[nlines
++] = tell(desc
);
748 #else /* lseek linear. */
750 struct cleanup
*old_cleanups
;
752 /* st_size might be a large type, but we only support source files whose
753 size fits in an int. */
754 size
= (int) st
.st_size
;
756 /* Use malloc, not alloca, because this may be pretty large, and we may
757 run into various kinds of limits on stack size. */
758 data
= (char *) xmalloc (size
);
759 old_cleanups
= make_cleanup (free
, data
);
761 if (myread (desc
, data
, size
) < 0)
762 perror_with_name (s
->filename
);
770 /* A newline at the end does not start a new line. */
773 if (nlines
== lines_allocated
)
775 lines_allocated
*= 2;
777 (int *) xmrealloc (s
-> objfile
-> md
, (char *) line_charpos
,
778 sizeof (int) * lines_allocated
);
780 line_charpos
[nlines
++] = p
- data
;
783 do_cleanups (old_cleanups
);
785 #endif /* lseek linear. */
788 (int *) xmrealloc (s
-> objfile
-> md
, (char *) line_charpos
,
789 nlines
* sizeof (int));
793 /* Return the character position of a line LINE in symtab S.
794 Return 0 if anything is invalid. */
796 #if 0 /* Currently unused */
799 source_line_charpos (s
, line
)
804 if (!s
->line_charpos
|| line
<= 0) return 0;
805 if (line
> s
->nlines
)
807 return s
->line_charpos
[line
- 1];
810 /* Return the line number of character position POS in symtab S. */
813 source_charpos_line (s
, chr
)
814 register struct symtab
*s
;
817 register int line
= 0;
820 if (s
== 0 || s
->line_charpos
== 0) return 0;
821 lnp
= s
->line_charpos
;
822 /* Files are usually short, so sequential search is Ok */
823 while (line
< s
->nlines
&& *lnp
<= chr
)
828 if (line
>= s
->nlines
)
836 /* Get full pathname and line number positions for a symtab.
837 Return nonzero if line numbers may have changed.
838 Set *FULLNAME to actual name of the file as found by `openp',
839 or to 0 if the file is not found. */
842 get_filename_and_charpos (s
, fullname
)
846 register int desc
, linenums_changed
= 0;
848 desc
= open_source_file (s
);
856 *fullname
= s
->fullname
;
857 if (s
->line_charpos
== 0) linenums_changed
= 1;
858 if (linenums_changed
) find_source_lines (s
, desc
);
860 return linenums_changed
;
863 /* Print text describing the full name of the source file S
864 and the line number LINE and its corresponding character position.
865 The text starts with two Ctrl-z so that the Emacs-GDB interface
868 MID_STATEMENT is nonzero if the PC is not at the beginning of that line.
870 Return 1 if successful, 0 if could not find the file. */
873 identify_source_line (s
, line
, mid_statement
, pc
)
879 if (s
->line_charpos
== 0)
880 get_filename_and_charpos (s
, (char **)NULL
);
881 if (s
->fullname
== 0)
883 if (line
> s
->nlines
)
884 /* Don't index off the end of the line_charpos array. */
886 annotate_source (s
->fullname
, line
, s
->line_charpos
[line
- 1],
889 current_source_line
= line
;
890 first_line_listed
= line
;
891 last_line_listed
= line
;
892 current_source_symtab
= s
;
896 /* Print source lines from the file of symtab S,
897 starting with line number LINE and stopping before line number STOPLINE. */
900 print_source_lines (s
, line
, stopline
, noerror
)
907 register FILE *stream
;
908 int nlines
= stopline
- line
;
910 /* Regardless of whether we can open the file, set current_source_symtab. */
911 current_source_symtab
= s
;
912 current_source_line
= line
;
913 first_line_listed
= line
;
915 desc
= open_source_file (s
);
919 char *name
= alloca (strlen (s
->filename
) + 100);
920 sprintf (name
, "%s:%d", s
->filename
, line
);
921 print_sys_errmsg (name
, errno
);
926 if (s
->line_charpos
== 0)
927 find_source_lines (s
, desc
);
929 if (line
< 1 || line
> s
->nlines
)
932 error ("Line number %d out of range; %s has %d lines.",
933 line
, s
->filename
, s
->nlines
);
936 if (lseek (desc
, s
->line_charpos
[line
- 1], 0) < 0)
939 perror_with_name (s
->filename
);
942 stream
= fdopen (desc
, FOPEN_RT
);
949 last_line_listed
= current_source_line
;
950 printf_filtered ("%d\t", current_source_line
++);
953 if (c
< 040 && c
!= '\t' && c
!= '\n' && c
!= '\r')
954 printf_filtered ("^%c", c
+ 0100);
956 printf_filtered ("^?");
958 printf_filtered ("%c", c
);
959 } while (c
!= '\n' && (c
= fgetc (stream
)) >= 0);
967 /* Print a list of files and line numbers which a user may choose from
968 in order to list a function which was specified ambiguously (as with
969 `list classname::overloadedfuncname', for example). The vector in
970 SALS provides the filenames and line numbers. */
973 ambiguous_line_spec (sals
)
974 struct symtabs_and_lines
*sals
;
978 for (i
= 0; i
< sals
->nelts
; ++i
)
979 printf_filtered("file: \"%s\", line number: %d\n",
980 sals
->sals
[i
].symtab
->filename
, sals
->sals
[i
].line
);
984 list_command (arg
, from_tty
)
988 struct symtabs_and_lines sals
, sals_end
;
989 struct symtab_and_line sal
, sal_end
;
998 if (!have_full_symbols () && !have_partial_symbols())
999 error ("No symbol table is loaded. Use the \"file\" command.");
1001 /* Pull in a current source symtab if necessary */
1002 if (current_source_symtab
== 0 &&
1003 (arg
== 0 || arg
[0] == '+' || arg
[0] == '-'))
1004 select_source_symtab (0);
1006 /* "l" or "l +" lists next ten lines. */
1008 if (arg
== 0 || STREQ (arg
, "+"))
1010 if (current_source_symtab
== 0)
1011 error ("No default source file yet. Do \"help list\".");
1012 print_source_lines (current_source_symtab
, current_source_line
,
1013 current_source_line
+ lines_to_list
, 0);
1017 /* "l -" lists previous ten lines, the ones before the ten just listed. */
1018 if (STREQ (arg
, "-"))
1020 if (current_source_symtab
== 0)
1021 error ("No default source file yet. Do \"help list\".");
1022 print_source_lines (current_source_symtab
,
1023 max (first_line_listed
- lines_to_list
, 1),
1024 first_line_listed
, 0);
1028 /* Now if there is only one argument, decode it in SAL
1030 If there are two arguments, decode them in SAL and SAL_END
1031 and clear NO_END; however, if one of the arguments is blank,
1032 set DUMMY_BEG or DUMMY_END to record that fact. */
1039 sals
= decode_line_1 (&arg1
, 0, 0, 0, 0);
1041 if (! sals
.nelts
) return; /* C++ */
1044 ambiguous_line_spec (&sals
);
1053 /* Record whether the BEG arg is all digits. */
1055 for (p
= arg
; p
!= arg1
&& *p
>= '0' && *p
<= '9'; p
++);
1056 linenum_beg
= (p
== arg1
);
1058 while (*arg1
== ' ' || *arg1
== '\t')
1064 while (*arg1
== ' ' || *arg1
== '\t')
1071 sals_end
= decode_line_1 (&arg1
, 0, 0, 0, 0);
1073 sals_end
= decode_line_1 (&arg1
, 0, sal
.symtab
, sal
.line
, 0);
1074 if (sals_end
.nelts
== 0)
1076 if (sals_end
.nelts
> 1)
1078 ambiguous_line_spec (&sals_end
);
1079 free (sals_end
.sals
);
1082 sal_end
= sals_end
.sals
[0];
1083 free (sals_end
.sals
);
1088 error ("Junk at end of line specification.");
1090 if (!no_end
&& !dummy_beg
&& !dummy_end
1091 && sal
.symtab
!= sal_end
.symtab
)
1092 error ("Specified start and end are in different files.");
1093 if (dummy_beg
&& dummy_end
)
1094 error ("Two empty args do not say what lines to list.");
1096 /* if line was specified by address,
1097 first print exactly which line, and which file.
1098 In this case, sal.symtab == 0 means address is outside
1099 of all known source files, not that user failed to give a filename. */
1102 if (sal
.symtab
== 0)
1103 /* FIXME-32x64--assumes sal.pc fits in long. */
1104 error ("No source file for address %s.",
1105 local_hex_string((unsigned long) sal
.pc
));
1106 sym
= find_pc_function (sal
.pc
);
1109 print_address_numeric (sal
.pc
, 1, gdb_stdout
);
1110 printf_filtered (" is in ");
1111 fputs_filtered (SYMBOL_SOURCE_NAME (sym
), gdb_stdout
);
1112 printf_filtered (" (%s:%d).\n", sal
.symtab
->filename
, sal
.line
);
1116 print_address_numeric (sal
.pc
, 1, gdb_stdout
);
1117 printf_filtered (" is at %s:%d.\n",
1118 sal
.symtab
->filename
, sal
.line
);
1122 /* If line was not specified by just a line number,
1123 and it does not imply a symtab, it must be an undebuggable symbol
1124 which means no source code. */
1126 if (! linenum_beg
&& sal
.symtab
== 0)
1127 error ("No line number known for %s.", arg
);
1129 /* If this command is repeated with RET,
1130 turn it into the no-arg variant. */
1135 if (dummy_beg
&& sal_end
.symtab
== 0)
1136 error ("No default source file yet. Do \"help list\".");
1138 print_source_lines (sal_end
.symtab
,
1139 max (sal_end
.line
- (lines_to_list
- 1), 1),
1140 sal_end
.line
+ 1, 0);
1141 else if (sal
.symtab
== 0)
1142 error ("No default source file yet. Do \"help list\".");
1144 print_source_lines (sal
.symtab
,
1145 max (sal
.line
- (lines_to_list
/ 2), 1),
1146 sal
.line
+ (lines_to_list
/ 2), 0);
1148 print_source_lines (sal
.symtab
, sal
.line
,
1150 ? sal
.line
+ lines_to_list
1151 : sal_end
.line
+ 1),
1155 /* Print info on range of pc's in a specified line. */
1158 line_info (arg
, from_tty
)
1162 struct symtabs_and_lines sals
;
1163 struct symtab_and_line sal
;
1164 CORE_ADDR start_pc
, end_pc
;
1169 sal
.symtab
= current_source_symtab
;
1170 sal
.line
= last_line_listed
;
1173 sals
.sals
= (struct symtab_and_line
*)
1174 xmalloc (sizeof (struct symtab_and_line
));
1179 sals
= decode_line_spec_1 (arg
, 0);
1184 /* C++ More than one line may have been specified, as when the user
1185 specifies an overloaded function name. Print info on them all. */
1186 for (i
= 0; i
< sals
.nelts
; i
++)
1190 if (sal
.symtab
== 0)
1192 printf_filtered ("No line number information available");
1195 /* This is useful for "info line *0x7f34". If we can't tell the
1196 user about a source line, at least let them have the symbolic
1198 printf_filtered (" for address ");
1200 print_address (sal
.pc
, gdb_stdout
);
1203 printf_filtered (".");
1204 printf_filtered ("\n");
1206 else if (sal
.line
> 0
1207 && find_line_pc_range (sal
, &start_pc
, &end_pc
))
1209 if (start_pc
== end_pc
)
1211 printf_filtered ("Line %d of \"%s\"",
1212 sal
.line
, sal
.symtab
->filename
);
1214 printf_filtered (" is at address ");
1215 print_address (start_pc
, gdb_stdout
);
1217 printf_filtered (" but contains no code.\n");
1221 printf_filtered ("Line %d of \"%s\"",
1222 sal
.line
, sal
.symtab
->filename
);
1224 printf_filtered (" starts at address ");
1225 print_address (start_pc
, gdb_stdout
);
1227 printf_filtered (" and ends at ");
1228 print_address (end_pc
, gdb_stdout
);
1229 printf_filtered (".\n");
1232 /* x/i should display this line's code. */
1233 set_next_address (start_pc
);
1235 /* Repeating "info line" should do the following line. */
1236 last_line_listed
= sal
.line
+ 1;
1238 /* If this is the only line, show the source code. If it could
1239 not find the file, don't do anything special. */
1240 if (annotation_level
&& sals
.nelts
== 1)
1241 identify_source_line (sal
.symtab
, sal
.line
, 0, start_pc
);
1244 /* Is there any case in which we get here, and have an address
1245 which the user would want to see? If we have debugging symbols
1246 and no line numbers? */
1247 printf_filtered ("Line number %d is out of range for \"%s\".\n",
1248 sal
.line
, sal
.symtab
->filename
);
1253 /* Commands to search the source file for a regexp. */
1257 forward_search_command (regex
, from_tty
)
1263 register FILE *stream
;
1264 int line
= last_line_listed
+ 1;
1267 msg
= (char *) re_comp (regex
);
1271 if (current_source_symtab
== 0)
1272 select_source_symtab (0);
1274 /* Search from last_line_listed+1 in current_source_symtab */
1276 desc
= open_source_file (current_source_symtab
);
1278 perror_with_name (current_source_symtab
->filename
);
1280 if (current_source_symtab
->line_charpos
== 0)
1281 find_source_lines (current_source_symtab
, desc
);
1283 if (line
< 1 || line
> current_source_symtab
->nlines
)
1286 error ("Expression not found");
1289 if (lseek (desc
, current_source_symtab
->line_charpos
[line
- 1], 0) < 0)
1292 perror_with_name (current_source_symtab
->filename
);
1295 stream
= fdopen (desc
, FOPEN_RT
);
1298 static char *buf
= NULL
;
1300 int cursize
, newsize
;
1303 buf
= xmalloc (cursize
);
1311 if (p
- buf
== cursize
)
1313 newsize
= cursize
+ cursize
/ 2;
1314 buf
= xrealloc (buf
, newsize
);
1318 } while (c
!= '\n' && (c
= getc (stream
)) >= 0);
1320 /* we now have a source line in buf, null terminate and match */
1322 if (re_exec (buf
) > 0)
1326 print_source_lines (current_source_symtab
, line
, line
+1, 0);
1327 set_internalvar (lookup_internalvar ("_"),
1328 value_from_longest (builtin_type_int
,
1330 current_source_line
= max (line
- lines_to_list
/ 2, 1);
1336 printf_filtered ("Expression not found\n");
1342 reverse_search_command (regex
, from_tty
)
1348 register FILE *stream
;
1349 int line
= last_line_listed
- 1;
1352 msg
= (char *) re_comp (regex
);
1356 if (current_source_symtab
== 0)
1357 select_source_symtab (0);
1359 /* Search from last_line_listed-1 in current_source_symtab */
1361 desc
= open_source_file (current_source_symtab
);
1363 perror_with_name (current_source_symtab
->filename
);
1365 if (current_source_symtab
->line_charpos
== 0)
1366 find_source_lines (current_source_symtab
, desc
);
1368 if (line
< 1 || line
> current_source_symtab
->nlines
)
1371 error ("Expression not found");
1374 if (lseek (desc
, current_source_symtab
->line_charpos
[line
- 1], 0) < 0)
1377 perror_with_name (current_source_symtab
->filename
);
1380 stream
= fdopen (desc
, FOPEN_RT
);
1384 /* FIXME!!! We walk right off the end of buf if we get a long line!!! */
1385 char buf
[4096]; /* Should be reasonable??? */
1386 register char *p
= buf
;
1393 } while (c
!= '\n' && (c
= getc (stream
)) >= 0);
1395 /* We now have a source line in buf; null terminate and match. */
1397 if (re_exec (buf
) > 0)
1401 print_source_lines (current_source_symtab
,
1403 set_internalvar (lookup_internalvar ("_"),
1404 value_from_longest (builtin_type_int
,
1406 current_source_line
= max (line
- lines_to_list
/ 2, 1);
1410 if (fseek (stream
, current_source_symtab
->line_charpos
[line
- 1], 0) < 0)
1413 perror_with_name (current_source_symtab
->filename
);
1417 printf_filtered ("Expression not found\n");
1423 _initialize_source ()
1425 struct cmd_list_element
*c
;
1426 current_source_symtab
= 0;
1427 init_source_path ();
1429 /* The intention is to use POSIX Basic Regular Expressions.
1430 Always use the GNU regex routine for consistency across all hosts.
1431 Our current GNU regex.c does not have all the POSIX features, so this is
1432 just an approximation. */
1433 re_set_syntax (RE_SYNTAX_GREP
);
1435 c
= add_cmd ("directory", class_files
, directory_command
,
1436 "Add directory DIR to beginning of search path for source files.\n\
1437 Forget cached info on source file locations and line positions.\n\
1438 DIR can also be $cwd for the current working directory, or $cdir for the\n\
1439 directory in which the source file was compiled into object code.\n\
1440 With no argument, reset the search path to $cdir:$cwd, the default.",
1442 c
->completer
= filename_completer
;
1444 add_cmd ("directories", no_class
, show_directories
,
1445 "Current search path for finding source files.\n\
1446 $cwd in the path means the current working directory.\n\
1447 $cdir in the path means the compilation directory of the source file.",
1450 add_info ("source", source_info
,
1451 "Information about the current source file.");
1453 add_info ("line", line_info
,
1454 concat ("Core addresses of the code for a source line.\n\
1455 Line can be specified as\n\
1456 LINENUM, to list around that line in current file,\n\
1457 FILE:LINENUM, to list around that line in that file,\n\
1458 FUNCTION, to list around beginning of that function,\n\
1459 FILE:FUNCTION, to distinguish among like-named static functions.\n\
1461 Default is to describe the last source line that was listed.\n\n\
1462 This sets the default address for \"x\" to the line's first instruction\n\
1463 so that \"x/i\" suffices to start examining the machine code.\n\
1464 The address is also stored as the value of \"$_\".", NULL
));
1466 add_com ("forward-search", class_files
, forward_search_command
,
1467 "Search for regular expression (see regex(3)) from last line listed.\n\
1468 The matching line number is also stored as the value of \"$_\".");
1469 add_com_alias ("search", "forward-search", class_files
, 0);
1471 add_com ("reverse-search", class_files
, reverse_search_command
,
1472 "Search backward for regular expression (see regex(3)) from last line listed.\n\
1473 The matching line number is also stored as the value of \"$_\".");
1475 add_com ("list", class_files
, list_command
,
1476 concat ("List specified function or line.\n\
1477 With no argument, lists ten more lines after or around previous listing.\n\
1478 \"list -\" lists the ten lines before a previous ten-line listing.\n\
1479 One argument specifies a line, and ten lines are listed around that line.\n\
1480 Two arguments with comma between specify starting and ending lines to list.\n\
1482 Lines can be specified in these ways:\n\
1483 LINENUM, to list around that line in current file,\n\
1484 FILE:LINENUM, to list around that line in that file,\n\
1485 FUNCTION, to list around beginning of that function,\n\
1486 FILE:FUNCTION, to distinguish among like-named static functions.\n\
1487 *ADDRESS, to list around the line containing that address.\n\
1488 With two args if one is empty it stands for ten lines away from the other arg.", NULL
));
1490 add_com_alias ("l", "list", class_files
, 1);
1493 (add_set_cmd ("listsize", class_support
, var_uinteger
,
1494 (char *)&lines_to_list
,
1495 "Set number of source lines gdb will list by default.",
This page took 0.078749 seconds and 4 git commands to generate.