* gdb doesn't print Lisp backtrace in some circumstances. @ 2024-04-12 10:31 Alan Mackenzie 2024-04-12 11:11 ` Eli Zaretskii 0 siblings, 1 reply; 10+ messages in thread From: Alan Mackenzie @ 2024-04-12 10:31 UTC (permalink / raw) To: emacs-devel Hello, Emacs. Yesterday I got a core dump from a segmentation fault in Emacs (my development version, not master). I loaded this into gdb inside Emacs to have a look at it. The backtrace command output the C data as it should, but on coming to the Lisp backtrace gave an error message about there needing to be a process running to "do this". (I don't have the exact message any more.) It would seem these fancy Lisp facilities only work when the process that produced them is still running. All the information required to produce this Lisp backtrace is present in the core dump. Would it be possible, perhaps, to modify our .gdbinit to use the running Emacs to process the core dump, or something like that? Extracting useful information from the C backtrace is slow and tedious in the extreme. -- Alan Mackenzie (Nuremberg, Germany). ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: gdb doesn't print Lisp backtrace in some circumstances. 2024-04-12 10:31 gdb doesn't print Lisp backtrace in some circumstances Alan Mackenzie @ 2024-04-12 11:11 ` Eli Zaretskii 2024-04-12 11:29 ` Alan Mackenzie 2024-04-12 14:48 ` Gerd Möllmann 0 siblings, 2 replies; 10+ messages in thread From: Eli Zaretskii @ 2024-04-12 11:11 UTC (permalink / raw) To: Alan Mackenzie; +Cc: emacs-devel > Date: Fri, 12 Apr 2024 10:31:53 +0000 > From: Alan Mackenzie <acm@muc.de> > > Yesterday I got a core dump from a segmentation fault in Emacs (my > development version, not master). I loaded this into gdb inside Emacs > to have a look at it. > > The backtrace command output the C data as it should, but on coming to > the Lisp backtrace gave an error message about there needing to be a > process running to "do this". (I don't have the exact message any > more.) It would seem these fancy Lisp facilities only work when the > process that produced them is still running. Yes, because they call functions inside Emacs to format Lisp objects. > All the information required to produce this Lisp backtrace is present > in the core dump. Would it be possible, perhaps, to modify our .gdbinit > to use the running Emacs to process the core dump, or something like > that? I don't think so, no. But you can reproduce the Lisp backtrace manually (albeit tediously, by going over all the calls to Ffuncall, eval_sub and suchlikes, and displaying their arg[0]. If it's a symbol, typing xsymbol should show you the Lisp function being called. If it is not a symbol, you could use xcar/xcdr etc., but that is much more tedious, and I usually give up on those frames in the stack. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: gdb doesn't print Lisp backtrace in some circumstances. 2024-04-12 11:11 ` Eli Zaretskii @ 2024-04-12 11:29 ` Alan Mackenzie 2024-04-12 12:03 ` Eli Zaretskii 2024-04-12 14:48 ` Gerd Möllmann 1 sibling, 1 reply; 10+ messages in thread From: Alan Mackenzie @ 2024-04-12 11:29 UTC (permalink / raw) To: Eli Zaretskii; +Cc: emacs-devel Hello, Eli. On Fri, Apr 12, 2024 at 14:11:04 +0300, Eli Zaretskii wrote: > > Date: Fri, 12 Apr 2024 10:31:53 +0000 > > From: Alan Mackenzie <acm@muc.de> > > Yesterday I got a core dump from a segmentation fault in Emacs (my > > development version, not master). I loaded this into gdb inside Emacs > > to have a look at it. > > The backtrace command output the C data as it should, but on coming to > > the Lisp backtrace gave an error message about there needing to be a > > process running to "do this". (I don't have the exact message any > > more.) It would seem these fancy Lisp facilities only work when the > > process that produced them is still running. > Yes, because they call functions inside Emacs to format Lisp objects. > > All the information required to produce this Lisp backtrace is present > > in the core dump. Would it be possible, perhaps, to modify our .gdbinit > > to use the running Emacs to process the core dump, or something like > > that? > I don't think so, no. That's what I feared. > But you can reproduce the Lisp backtrace manually (albeit tediously, > by going over all the calls to Ffuncall, eval_sub and suchlikes, and > displaying their arg[0]. If it's a symbol, typing xsymbol should show > you the Lisp function being called. If it is not a symbol, you could > use xcar/xcdr etc., but that is much more tedious, and I usually give > up on those frames in the stack. I spent a large part of yesterday on this dump. It ends up with a call (apply apply ...) which goes into an infinite recursion with the number of arguments increasing by 1 at each stage. I've found the point in the backtrace where the recursion starts, but it's tedious indeed getting information out of it. I think I'll have to, though, since I can't see any other way of debugging this at the moment. -- Alan Mackenzie (Nuremberg, Germany). ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: gdb doesn't print Lisp backtrace in some circumstances. 2024-04-12 11:29 ` Alan Mackenzie @ 2024-04-12 12:03 ` Eli Zaretskii 2024-04-12 13:18 ` Alan Mackenzie 0 siblings, 1 reply; 10+ messages in thread From: Eli Zaretskii @ 2024-04-12 12:03 UTC (permalink / raw) To: Alan Mackenzie; +Cc: emacs-devel > Date: Fri, 12 Apr 2024 11:29:29 +0000 > Cc: emacs-devel@gnu.org > From: Alan Mackenzie <acm@muc.de> > > > But you can reproduce the Lisp backtrace manually (albeit tediously, > > by going over all the calls to Ffuncall, eval_sub and suchlikes, and > > displaying their arg[0]. If it's a symbol, typing xsymbol should show > > you the Lisp function being called. If it is not a symbol, you could > > use xcar/xcdr etc., but that is much more tedious, and I usually give > > up on those frames in the stack. > > I spent a large part of yesterday on this dump. It ends up with a call > (apply apply ...) which goes into an infinite recursion with the number > of arguments increasing by 1 at each stage. I've found the point in the > backtrace where the recursion starts, but it's tedious indeed getting > information out of it. I think I'll have to, though, since I can't see > any other way of debugging this at the moment. One way of avoiding all this tedious manual work is to try to catch the problem with a breakpoint in a running Emacs, not in a core dump. You need to be creative and most probably invest a lot of efforts in trial-and-error to come up with a breakpoint place and condition that on one hand doesn't cause it to trigger too often for false positives, and OTOH doesn't miss the real problem. An easier way is to run Emacs under GDB to begin with, and do what you need to do when it catches the segfault, before dumping core. At that point, you still have a running Emacs, and can call functions inside it, albeit less safely (because when Emacs is crashing, its Lisp machine could be utterly confused or messed up). ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: gdb doesn't print Lisp backtrace in some circumstances. 2024-04-12 12:03 ` Eli Zaretskii @ 2024-04-12 13:18 ` Alan Mackenzie 2024-04-12 13:24 ` Eli Zaretskii 0 siblings, 1 reply; 10+ messages in thread From: Alan Mackenzie @ 2024-04-12 13:18 UTC (permalink / raw) To: Eli Zaretskii; +Cc: emacs-devel Hello, Eli. On Fri, Apr 12, 2024 at 15:03:03 +0300, Eli Zaretskii wrote: > > Date: Fri, 12 Apr 2024 11:29:29 +0000 > > Cc: emacs-devel@gnu.org > > From: Alan Mackenzie <acm@muc.de> > > > > > But you can reproduce the Lisp backtrace manually (albeit tediously, > > > by going over all the calls to Ffuncall, eval_sub and suchlikes, and > > > displaying their arg[0]. If it's a symbol, typing xsymbol should show > > > you the Lisp function being called. If it is not a symbol, you could > > > use xcar/xcdr etc., but that is much more tedious, and I usually give > > > up on those frames in the stack. > > > > I spent a large part of yesterday on this dump. It ends up with a call > > (apply apply ...) which goes into an infinite recursion with the number > > of arguments increasing by 1 at each stage. I've found the point in the > > backtrace where the recursion starts, but it's tedious indeed getting > > information out of it. I think I'll have to, though, since I can't see > > any other way of debugging this at the moment. > One way of avoiding all this tedious manual work is to try to catch > the problem with a breakpoint in a running Emacs, not in a core dump. That won't work for this situation. The seg fault is happening whilst loading isearch.el from loadup.el during early building. I don't have a running Emacs to probe it with. > You need to be creative and most probably invest a lot of efforts in > trial-and-error to come up with a breakpoint place and condition that > on one hand doesn't cause it to trigger too often for false positives, > and OTOH doesn't miss the real problem. Yes. This is the curse of using debuggers, the difficulty of getting breakpoints placed effectively. GDB is quite good in this respect, since you can put a condition on any breakpoint to reduce the false positives. > An easier way is to run Emacs under GDB to begin with, and do what you > need to do when it catches the segfault, before dumping core. At that > point, you still have a running Emacs, and can call functions inside > it, albeit less safely (because when Emacs is crashing, its Lisp > machine could be utterly confused or messed up). -- Alan Mackenzie (Nuremberg, Germany). ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: gdb doesn't print Lisp backtrace in some circumstances. 2024-04-12 13:18 ` Alan Mackenzie @ 2024-04-12 13:24 ` Eli Zaretskii 2024-04-13 10:07 ` Alan Mackenzie 0 siblings, 1 reply; 10+ messages in thread From: Eli Zaretskii @ 2024-04-12 13:24 UTC (permalink / raw) To: Alan Mackenzie; +Cc: emacs-devel > Date: Fri, 12 Apr 2024 13:18:15 +0000 > Cc: emacs-devel@gnu.org > From: Alan Mackenzie <acm@muc.de> > > > One way of avoiding all this tedious manual work is to try to catch > > the problem with a breakpoint in a running Emacs, not in a core dump. > > That won't work for this situation. The seg fault is happening whilst > loading isearch.el from loadup.el during early building. I don't have a > running Emacs to probe it with. I don't see why can't you have a running Emacs. You just need to run temacs under GDB instead of emacs, and you need to run the exact command that crashes under GDB. To see what command crashes, run "make V=1", to force make to display every command it runs in its entirety. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: gdb doesn't print Lisp backtrace in some circumstances. 2024-04-12 13:24 ` Eli Zaretskii @ 2024-04-13 10:07 ` Alan Mackenzie 0 siblings, 0 replies; 10+ messages in thread From: Alan Mackenzie @ 2024-04-13 10:07 UTC (permalink / raw) To: Eli Zaretskii; +Cc: emacs-devel Hello, Eli. On Fri, Apr 12, 2024 at 16:24:53 +0300, Eli Zaretskii wrote: > > Date: Fri, 12 Apr 2024 13:18:15 +0000 > > Cc: emacs-devel@gnu.org > > From: Alan Mackenzie <acm@muc.de> > > > One way of avoiding all this tedious manual work is to try to catch > > > the problem with a breakpoint in a running Emacs, not in a core dump. > > That won't work for this situation. The seg fault is happening whilst > > loading isearch.el from loadup.el during early building. I don't have a > > running Emacs to probe it with. > I don't see why can't you have a running Emacs. You just need to run > temacs under GDB instead of emacs, and you need to run the exact > command that crashes under GDB. To see what command crashes, run > "make V=1", to force make to display every command it runs in its > entirety. Maybe I'll try that. What I eventually did yesterday was to code in a limit of 150 to the length of the last argument in Fapply, signalling an error when it was higher. Even this (Lisp) backtrace is difficult to decypher. The backtrace I got is a mess. The problem has a lot to do with generic functions, and cl-generic.el is as good as entirely undocumented. Didn't we have somebody volunteering to fix this some months ago? Has anything come of that, yet? -- Alan Mackenzie (Nuremberg, Germany). ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: gdb doesn't print Lisp backtrace in some circumstances. 2024-04-12 11:11 ` Eli Zaretskii 2024-04-12 11:29 ` Alan Mackenzie @ 2024-04-12 14:48 ` Gerd Möllmann 2024-04-12 14:56 ` Gerd Möllmann 1 sibling, 1 reply; 10+ messages in thread From: Gerd Möllmann @ 2024-04-12 14:48 UTC (permalink / raw) To: Eli Zaretskii; +Cc: Alan Mackenzie, emacs-devel Eli Zaretskii <eliz@gnu.org> writes: >> Date: Fri, 12 Apr 2024 10:31:53 +0000 >> From: Alan Mackenzie <acm@muc.de> >> >> Yesterday I got a core dump from a segmentation fault in Emacs (my >> development version, not master). I loaded this into gdb inside Emacs >> to have a look at it. >> >> The backtrace command output the C data as it should, but on coming to >> the Lisp backtrace gave an error message about there needing to be a >> process running to "do this". (I don't have the exact message any >> more.) It would seem these fancy Lisp facilities only work when the >> process that produced them is still running. > > Yes, because they call functions inside Emacs to format Lisp objects. > >> All the information required to produce this Lisp backtrace is present >> in the core dump. Would it be possible, perhaps, to modify our .gdbinit >> to use the running Emacs to process the core dump, or something like >> that? > > I don't think so, no. But you can reproduce the Lisp backtrace > manually (albeit tediously, by going over all the calls to Ffuncall, > eval_sub and suchlikes, and displaying their arg[0]. If it's a > symbol, typing xsymbol should show you the Lisp function being called. > If it is not a symbol, you could use xcar/xcdr etc., but that is much > more tedious, and I usually give up on those frames in the stack. I think it's easier to go through the specbinding stack (current_thread->m_specdl). For LLDB, I did that in the xbacktrace function in etc/emacs_lldb.py. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: gdb doesn't print Lisp backtrace in some circumstances. 2024-04-12 14:48 ` Gerd Möllmann @ 2024-04-12 14:56 ` Gerd Möllmann 2024-04-12 15:08 ` Eli Zaretskii 0 siblings, 1 reply; 10+ messages in thread From: Gerd Möllmann @ 2024-04-12 14:56 UTC (permalink / raw) To: Eli Zaretskii; +Cc: Alan Mackenzie, emacs-devel Gerd Möllmann <gerd.moellmann@gmail.com> writes: > I think it's easier to go through the specbinding stack > (current_thread->m_specdl). For LLDB, I did that in the xbacktrace > function in etc/emacs_lldb.py. It just remembered that the very first xbacktrace I added did it in a similar way, so a very old .gdbinit may contain something of a starting point. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: gdb doesn't print Lisp backtrace in some circumstances. 2024-04-12 14:56 ` Gerd Möllmann @ 2024-04-12 15:08 ` Eli Zaretskii 0 siblings, 0 replies; 10+ messages in thread From: Eli Zaretskii @ 2024-04-12 15:08 UTC (permalink / raw) To: Gerd Möllmann; +Cc: acm, emacs-devel > From: Gerd Möllmann <gerd.moellmann@gmail.com> > Cc: Alan Mackenzie <acm@muc.de>, emacs-devel@gnu.org > Date: Fri, 12 Apr 2024 16:56:58 +0200 > > Gerd Möllmann <gerd.moellmann@gmail.com> writes: > > > I think it's easier to go through the specbinding stack > > (current_thread->m_specdl). For LLDB, I did that in the xbacktrace > > function in etc/emacs_lldb.py. > > It just remembered that the very first xbacktrace I added did it in a > similar way, so a very old .gdbinit may contain something of a starting > point. Printing Lisp objects would still be a problem, though, even if the backtrace is shown. ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2024-04-13 10:07 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-04-12 10:31 gdb doesn't print Lisp backtrace in some circumstances Alan Mackenzie 2024-04-12 11:11 ` Eli Zaretskii 2024-04-12 11:29 ` Alan Mackenzie 2024-04-12 12:03 ` Eli Zaretskii 2024-04-12 13:18 ` Alan Mackenzie 2024-04-12 13:24 ` Eli Zaretskii 2024-04-13 10:07 ` Alan Mackenzie 2024-04-12 14:48 ` Gerd Möllmann 2024-04-12 14:56 ` Gerd Möllmann 2024-04-12 15:08 ` Eli Zaretskii
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).