When there is no symbols gdb prints backtraces as "f() in blah.so" for exported symbols and "?? in blah.so" for non-exported symbols (I think). Anyway, once I have symbols it instead prints "f() at utils.c:42" which is great, however, often I still want the name of the binary that holds this function. A pretty common use case for me is to find a SEGV in some random complex program on Ubuntu (a program that I use a lot but that I don't do development on) and I run it in gdb and I find a backtrace that runs through several libraries. For example, "evolution" calling into "libmailstuff" which calls into "glib". Often I can guess where the bug is based on the backtrace (for example I know the bug is probably not in malloc() inside glibc and usually not in glib either). So basically my next step is to look at the code for the function above malloc() or whatever in the backtrace. Suppose the frame I find interesting is inside a library which has symbols installed so it's is printed like this "f() at utils.c:42". Now I have no way of knowing what package I should "apt-get source PKG" to find the yadayada.c file. If gdb instead printed "f() at utils.c:42 from some_binary.so" then I could just do "dpkg -S some_binary.so" and quickly I would directly know where to continue my investigation. Basically I think there is an implicit assumption that gdb is only used to debug programs that you wrote yourself (and hence you'd know what libraries are linked and which functions goes into what library etc) but honestly I think gdb is being used a lot today by people who don't really have this type of info. In particular all the automatic crash reports in ubuntu have stacks generated by gdb and the people triaging these bugs almost certain don't have detailed info about each program bugs are found inside. So, please can you add some switch/parameter to the "bt" command so that it also prints the name of the binary?
Created attachment 3727 [details] patch that makes gdb always print the binary for each function I found that it's sufficient to just remove the following if-statement from gdb/stack.c:729 to make gdb do what I'm talking about. This is the if statement: if (!funname || (!sal.symtab || !sal.symtab->filename)) Granted, this does not add a parameter to "bt" it just changes the default behavior. At least I hope this patch can serve as a starting point. Note: The condition "(!sal.symtab || !sal.symtab->filename)" is the logical opposite (according to de morgan's law) to "sal.symtab && sal.symtab->filename" which should explain why it's okay to drop the !funname part.
I think having this as an optional feature would be good. Maybe we could go a bit farther and let the user specify some kind of format string that would be used when printing frames in "bt".
I'm fine with always enabling it in general. Though with line wrapping the output may get a bit crowded.