* gdb mode with gdb command from the docker
@ 2020-10-18 15:08 William Xu
2020-10-18 15:57 ` Eli Zaretskii
2020-10-18 18:48 ` Yuri Khan
0 siblings, 2 replies; 13+ messages in thread
From: William Xu @ 2020-10-18 15:08 UTC (permalink / raw)
To: help-gnu-emacs
Hi,
I'm trying to use gdb mode with the gdb command from the docker image.
So i defined a wrapper of gdb from docker:
---------------------------------8<-------------------------------------
#!/bin/sh
arg="$@"
docker exec -i myproject gdb -i=mi ${arg}
---------------------------------8<-------------------------------------
Then invoke the gdb with: (gdb "/path/gdbWrapper"). The *gud* buffer
can be created successfully. The executable file can be loaded OK,
however, it reports some tty error while trying to run the executable:
---------------------------------8<-------------------------------------
(gdb) file a.out
Load new symbol table from "a.out"? (y or n) [answered Y; input not from terminal]
Reading symbols from a.out...done.
(gdb) r
Starting program: /test/a.out
/dev/ttys002: No such file or directory.
During startup program exited with code 1.
(gdb)
---------------------------------8<-------------------------------------
If I run the gdbWrapper directly from a terminal application,
everything is fine, i don't see the same error there. What could be
wrong in the gdb mode?
--
William
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: gdb mode with gdb command from the docker
2020-10-18 15:08 gdb mode with gdb command from the docker William Xu
@ 2020-10-18 15:57 ` Eli Zaretskii
2020-10-18 18:18 ` William Xu
2020-10-18 18:48 ` Yuri Khan
1 sibling, 1 reply; 13+ messages in thread
From: Eli Zaretskii @ 2020-10-18 15:57 UTC (permalink / raw)
To: help-gnu-emacs
> From: William Xu <william.xwl@gmail.com>
> Date: Sun, 18 Oct 2020 17:08:36 +0200
>
> Then invoke the gdb with: (gdb "/path/gdbWrapper"). The *gud* buffer
> can be created successfully. The executable file can be loaded OK,
> however, it reports some tty error while trying to run the executable:
>
> ---------------------------------8<-------------------------------------
> (gdb) file a.out
> Load new symbol table from "a.out"? (y or n) [answered Y; input not from terminal]
This is normal.
> Reading symbols from a.out...done.
> (gdb) r
> Starting program: /test/a.out
> /dev/ttys002: No such file or directory.
This is not, but the error message seems to come from a.out, not from
GDB. So I think you should review the program's code and see why it
fails that way.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: gdb mode with gdb command from the docker
2020-10-18 15:57 ` Eli Zaretskii
@ 2020-10-18 18:18 ` William Xu
2020-10-18 18:35 ` Eli Zaretskii
0 siblings, 1 reply; 13+ messages in thread
From: William Xu @ 2020-10-18 18:18 UTC (permalink / raw)
To: help-gnu-emacs
Eli Zaretskii <eliz@gnu.org> writes:
>> From: William Xu <william.xwl@gmail.com>
>> Date: Sun, 18 Oct 2020 17:08:36 +0200
>>
>> Then invoke the gdb with: (gdb "/path/gdbWrapper"). The *gud* buffer
>> can be created successfully. The executable file can be loaded OK,
>> however, it reports some tty error while trying to run the executable:
>>
>> ---------------------------------8<-------------------------------------
>> (gdb) file a.out
>> Load new symbol table from "a.out"? (y or n) [answered Y; input not from terminal]
>
> This is normal.
>
>> Reading symbols from a.out...done.
>> (gdb) r
>> Starting program: /test/a.out
>> /dev/ttys002: No such file or directory.
>
> This is not, but the error message seems to come from a.out, not from
> GDB. So I think you should review the program's code and see why it
> fails that way.
Hmm, I saw similar error in my original executable, in the created test
program, it only prints a string:
#include <iostream>
int main()
{
std::cout << "hi" << std::endl;
}
Also as I mentioned, if I run the gdbWrapper directly outside emacs, on
the terminal app (i'm running Terminal on macOS), there is no problem
seen at all . I think it is more likely something wrong inside emacs's
gdb mode. (I tested it also with `emacs -Q', same error)
--
William
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: gdb mode with gdb command from the docker
2020-10-18 18:18 ` William Xu
@ 2020-10-18 18:35 ` Eli Zaretskii
2020-10-20 19:54 ` William Xu
0 siblings, 1 reply; 13+ messages in thread
From: Eli Zaretskii @ 2020-10-18 18:35 UTC (permalink / raw)
To: help-gnu-emacs
> From: William Xu <william.xwl@gmail.com>
> Date: Sun, 18 Oct 2020 20:18:22 +0200
>
> >> (gdb) r
> >> Starting program: /test/a.out
> >> /dev/ttys002: No such file or directory.
> >
> > This is not, but the error message seems to come from a.out, not from
> > GDB. So I think you should review the program's code and see why it
> > fails that way.
>
> Hmm, I saw similar error in my original executable, in the created test
> program, it only prints a string:
The error message could come from some library function.
> Also as I mentioned, if I run the gdbWrapper directly outside emacs, on
> the terminal app (i'm running Terminal on macOS), there is no problem
> seen at all.
Of course: when the program is run from GDB under Emacs, the standard
output and standard input of the program are connected to a PTY
(pseudo-terminal), not to a real console device. So it is a small
wonder that the behavior is different.
> I think it is more likely something wrong inside emacs's
> gdb mode.
Maybe so, but I don't see what would cause this in gdb mode.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: gdb mode with gdb command from the docker
2020-10-18 18:35 ` Eli Zaretskii
@ 2020-10-20 19:54 ` William Xu
2020-10-21 16:10 ` Eli Zaretskii
0 siblings, 1 reply; 13+ messages in thread
From: William Xu @ 2020-10-20 19:54 UTC (permalink / raw)
To: help-gnu-emacs
Eli Zaretskii <eliz@gnu.org> writes:
>> Also as I mentioned, if I run the gdbWrapper directly outside emacs, on
>> the terminal app (i'm running Terminal on macOS), there is no problem
>> seen at all.
>
> Of course: when the program is run from GDB under Emacs, the standard
> output and standard input of the program are connected to a PTY
> (pseudo-terminal), not to a real console device. So it is a small
> wonder that the behavior is different.
>
>> I think it is more likely something wrong inside emacs's
>> gdb mode.
>
> Maybe so, but I don't see what would cause this in gdb mode.
I manage to make it work by disabling the gdb "-inferior-tty-set"
command in gdb-inferior-io--init-proc.
It seems that the problem is that, process.c::allocate_pty allocates a
pseudo-terminal for the *host*, I can find the same tty name in /dev on
the host. It then confuses the gdb command from the docker container.
Is there any reason to call "-inferior-tty-set" commands here? Can we
simply remove it?
---------------------------------8<-------------------------------------
$ git diff
diff --git a/lisp/progmodes/gdb-mi.el b/lisp/progmodes/gdb-mi.el
index e785acd284..63dae4b248 100644
--- a/lisp/progmodes/gdb-mi.el
+++ b/lisp/progmodes/gdb-mi.el
@@ -1590,12 +1590,13 @@ gdb-inferior-io--init-proc
(set-process-filter proc 'gdb-inferior-filter)
(set-process-sentinel proc 'gdb-inferior-io-sentinel)
;; The process can run on a remote host.
- (let ((tty (or (process-get proc 'remote-tty)
- (process-tty-name proc))))
- (unless (or (null tty)
- (string= tty ""))
- (gdb-input
- (concat "-inferior-tty-set " tty) 'ignore))))
+ ;; (let ((tty (or (process-get proc 'remote-tty)
+ ;; (process-tty-name proc))))
+ ;; (unless (or (null tty)
+ ;; (string= tty ""))
+ ;; (gdb-input
+ ;; (concat "-inferior-tty-set " tty) 'ignore)))
+ )
(defun gdb-inferior-io-sentinel (proc _str)
(when (eq (process-status proc) 'failed)
---------------------------------8<-------------------------------------
--
William
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: gdb mode with gdb command from the docker
2020-10-20 19:54 ` William Xu
@ 2020-10-21 16:10 ` Eli Zaretskii
2020-10-22 18:41 ` William Xu
0 siblings, 1 reply; 13+ messages in thread
From: Eli Zaretskii @ 2020-10-21 16:10 UTC (permalink / raw)
To: help-gnu-emacs
> From: William Xu <william.xwl@gmail.com>
> Date: Tue, 20 Oct 2020 21:54:55 +0200
>
> I manage to make it work by disabling the gdb "-inferior-tty-set"
> command in gdb-inferior-io--init-proc.
>
> It seems that the problem is that, process.c::allocate_pty allocates a
> pseudo-terminal for the *host*, I can find the same tty name in /dev on
> the host. It then confuses the gdb command from the docker container.
>
> Is there any reason to call "-inferior-tty-set" commands here? Can we
> simply remove it?
No, this setting is needed to separate the I/O device of the process
being debugged from that of GDB, so that we could redirect I/O of the
debuggee to a dedicated buffer used by "M-x gdb" to show interaction
with the program.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: gdb mode with gdb command from the docker
2020-10-21 16:10 ` Eli Zaretskii
@ 2020-10-22 18:41 ` William Xu
2020-10-22 18:49 ` Eli Zaretskii
0 siblings, 1 reply; 13+ messages in thread
From: William Xu @ 2020-10-22 18:41 UTC (permalink / raw)
To: help-gnu-emacs
Eli Zaretskii <eliz@gnu.org> writes:
> No, this setting is needed to separate the I/O device of the process
> being debugged from that of GDB, so that we could redirect I/O of the
> debuggee to a dedicated buffer used by "M-x gdb" to show interaction
> with the program.
Can we at least add an option to disable the I/O separation, like
gdb-disable-io-redirection? So that one can still have a working gdb,
even if the I/O are mixed with gdb commands. So that I would still have
the nice features of gdb modes, with which I can set breakpoints, follow
line by line in the source buffer. That is already a huge improvement on
the plain terminal gdb.
In addition, I just noticed that tramp seems supporting such kind of
remote debugging, from [[info:tramp#Remote processes][info:tramp#Remote processes]]:
,----
| 5.5.5 Running a debugger on a remote host
| -----------------------------------------
|
| ‘gud.el’ provides a unified interface to symbolic debuggers (*note
| (emacs)Debuggers::). TRAMP can run debug on remote hosts by calling
| ‘gdb’ with a remote file name:
|
| M-x gdb <RET>
| Run gdb (like this): gdb -i=mi /ssh:host:~/myprog <RET>
`----
Only that when trying it out with ssh method, I got an error after the
file is loaded. Should I report a bug for it?
---------------------------------8<-------------------------------------
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from /home/wx/tmp/a.out...
Debugger entered--Lisp error: (wrong-type-argument "consp nil")
signal(wrong-type-argument ("consp nil"))
tramp-signal-hook-function(wrong-type-argument (consp nil))
signal(wrong-type-argument (consp nil))
tramp-sh-handle-make-process(:name "gdb-inferior" :buffer #<buffer limbo<3>> :command nil :stderr nil :noquery nil :file-handler t)
apply(tramp-sh-handle-make-process (:name "gdb-inferior" :buffer #<buffer limbo<3>> :command nil :stderr nil :noquery nil :file-handler t))
tramp-sh-file-name-handler(make-process :name "gdb-inferior" :buffer #<buffer limbo<3>> :command nil :stderr nil :noquery nil :file-handler t)
apply(tramp-sh-file-name-handler make-process (:name "gdb-inferior" :buffer #<buffer limbo<3>> :command nil :stderr nil :noquery nil :file-handler t))
tramp-file-name-handler(make-process :name "gdb-inferior" :buffer #<buffer limbo<3>> :command nil :stderr nil :noquery nil :file-handler t)
tramp-handle-start-file-process("gdb-inferior" #<buffer limbo<3>> nil)
apply(tramp-handle-start-file-process ("gdb-inferior" #<buffer limbo<3>> nil))
tramp-sh-file-name-handler(start-file-process "gdb-inferior" #<buffer limbo<3>> nil)
apply(tramp-sh-file-name-handler start-file-process ("gdb-inferior" #<buffer limbo<3>> nil))
tramp-file-name-handler(start-file-process "gdb-inferior" #<buffer limbo<3>> nil)
apply(tramp-file-name-handler start-file-process "gdb-inferior" #<buffer limbo<3>> nil nil)
start-file-process("gdb-inferior" #<buffer limbo<3>> nil)
apply(start-file-process "gdb-inferior" #<buffer limbo<3>> nil nil)
comint-exec-1("gdb-inferior" #<buffer limbo<3>> nil nil)
comint-exec(#<buffer limbo<3>> "gdb-inferior" nil nil nil)
make-comint-in-buffer("gdb-inferior" #<buffer limbo<3>> nil)
gdb-inferior-io-mode()
gdb-get-buffer-create(gdb-inferior-io)
gdb-init-1()
gdb-update()
gdb("gdb -i=mi /ssh:wx@SERVER:/home/wx/tmp...")
funcall-interactively(gdb "gdb -i=mi /ssh:wx@SERVER:/home/wx/tmp...")
call-interactively(gdb record nil)
command-execute(gdb record)
execute-extended-command(nil "gdb" nil)
funcall-interactively(execute-extended-command nil "gdb" nil)
call-interactively(execute-extended-command nil nil)
command-execute(execute-extended-command)
---------------------------------8<-------------------------------------
--
William
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: gdb mode with gdb command from the docker
2020-10-22 18:41 ` William Xu
@ 2020-10-22 18:49 ` Eli Zaretskii
2020-10-22 19:27 ` William Xu
0 siblings, 1 reply; 13+ messages in thread
From: Eli Zaretskii @ 2020-10-22 18:49 UTC (permalink / raw)
To: help-gnu-emacs
> From: William Xu <william.xwl@gmail.com>
> Date: Thu, 22 Oct 2020 20:41:52 +0200
>
> Eli Zaretskii <eliz@gnu.org> writes:
>
> > No, this setting is needed to separate the I/O device of the process
> > being debugged from that of GDB, so that we could redirect I/O of the
> > debuggee to a dedicated buffer used by "M-x gdb" to show interaction
> > with the program.
>
> Can we at least add an option to disable the I/O separation, like
> gdb-disable-io-redirection? So that one can still have a working gdb,
> even if the I/O are mixed with gdb commands. So that I would still have
> the nice features of gdb modes, with which I can set breakpoints, follow
> line by line in the source buffer. That is already a huge improvement on
> the plain terminal gdb.
I don't understand why you need this. Didn't you say that the problem
disappears if you use Yuri's advice? Then why do we need any kludgey
changes in gdb-mi.el?
> In addition, I just noticed that tramp seems supporting such kind of
> remote debugging, from [[info:tramp#Remote processes][info:tramp#Remote processes]]:
>
> ,----
> | 5.5.5 Running a debugger on a remote host
> | -----------------------------------------
> |
> | ‘gud.el’ provides a unified interface to symbolic debuggers (*note
> | (emacs)Debuggers::). TRAMP can run debug on remote hosts by calling
> | ‘gdb’ with a remote file name:
> |
> | M-x gdb <RET>
> | Run gdb (like this): gdb -i=mi /ssh:host:~/myprog <RET>
> `----
>
> Only that when trying it out with ssh method, I got an error after the
> file is loaded. Should I report a bug for it?
Yes, please.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: gdb mode with gdb command from the docker
2020-10-22 18:49 ` Eli Zaretskii
@ 2020-10-22 19:27 ` William Xu
0 siblings, 0 replies; 13+ messages in thread
From: William Xu @ 2020-10-22 19:27 UTC (permalink / raw)
To: help-gnu-emacs
Eli Zaretskii <eliz@gnu.org> writes:
> I don't understand why you need this. Didn't you say that the problem
> disappears if you use Yuri's advice? Then why do we need any kludgey
> changes in gdb-mi.el?
Sorry for the confusion. I thought that was only for
verification/comparsion purpose, as running in the shell by "M-x shell"
is more or less the same as running it from terminal app. I won't have
all the nice features of gdb-mi.el.
But it looks like tramp remote debug is the better way to go. I will see
if we can have it working with tramp.
Thanks for the help.
>> Only that when trying it out with ssh method, I got an error after the
>> file is loaded. Should I report a bug for it?
>
> Yes, please.
Done.
--
William
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: gdb mode with gdb command from the docker
2020-10-18 15:08 gdb mode with gdb command from the docker William Xu
2020-10-18 15:57 ` Eli Zaretskii
@ 2020-10-18 18:48 ` Yuri Khan
2020-10-18 19:00 ` otadmor
2020-10-19 6:39 ` William Xu
1 sibling, 2 replies; 13+ messages in thread
From: Yuri Khan @ 2020-10-18 18:48 UTC (permalink / raw)
To: William Xu; +Cc: help-gnu-emacs
On Sun, 18 Oct 2020 at 18:08, William Xu <william.xwl@gmail.com> wrote:
> I'm trying to use gdb mode with the gdb command from the docker image.
> So i defined a wrapper of gdb from docker:
>
> ---------------------------------8<-------------------------------------
> #!/bin/sh
> arg="$@"
> docker exec -i myproject gdb -i=mi ${arg}
> ---------------------------------8<-------------------------------------
>
> Then invoke the gdb with: (gdb "/path/gdbWrapper"). The *gud* buffer
> can be created successfully. The executable file can be loaded OK,
> however, it reports some tty error while trying to run the executable:
Does giving the -t option to ‘docker exec’ help in any way? (I did not
test this; just a hunch because something seems to expect a tty and -t
causes docker to allocate one.)
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: gdb mode with gdb command from the docker
2020-10-18 18:48 ` Yuri Khan
@ 2020-10-18 19:00 ` otadmor
2020-10-19 6:41 ` William Xu
2020-10-19 6:39 ` William Xu
1 sibling, 1 reply; 13+ messages in thread
From: otadmor @ 2020-10-18 19:00 UTC (permalink / raw)
To: Yuri Khan; +Cc: William Xu, help-gnu-emacs
As gud is great and all, not always you need all of its capabilities.
Does running gdb from shell (M-x shell) works?
On Sun, Oct 18, 2020, 21:49 Yuri Khan <yuri.v.khan@gmail.com> wrote:
> On Sun, 18 Oct 2020 at 18:08, William Xu <william.xwl@gmail.com> wrote:
>
> > I'm trying to use gdb mode with the gdb command from the docker image.
> > So i defined a wrapper of gdb from docker:
> >
> > ---------------------------------8<-------------------------------------
> > #!/bin/sh
> > arg="$@"
> > docker exec -i myproject gdb -i=mi ${arg}
> > ---------------------------------8<-------------------------------------
> >
> > Then invoke the gdb with: (gdb "/path/gdbWrapper"). The *gud* buffer
> > can be created successfully. The executable file can be loaded OK,
> > however, it reports some tty error while trying to run the executable:
>
> Does giving the -t option to ‘docker exec’ help in any way? (I did not
> test this; just a hunch because something seems to expect a tty and -t
> causes docker to allocate one.)
>
>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: gdb mode with gdb command from the docker
2020-10-18 18:48 ` Yuri Khan
2020-10-18 19:00 ` otadmor
@ 2020-10-19 6:39 ` William Xu
1 sibling, 0 replies; 13+ messages in thread
From: William Xu @ 2020-10-19 6:39 UTC (permalink / raw)
To: help-gnu-emacs
Yuri Khan <yuri.v.khan@gmail.com> writes:
> On Sun, 18 Oct 2020 at 18:08, William Xu <william.xwl@gmail.com> wrote:
>
>> I'm trying to use gdb mode with the gdb command from the docker image.
>> So i defined a wrapper of gdb from docker:
>>
>> ---------------------------------8<-------------------------------------
>> #!/bin/sh
>> arg="$@"
>> docker exec -i myproject gdb -i=mi ${arg}
>> ---------------------------------8<-------------------------------------
>>
>> Then invoke the gdb with: (gdb "/path/gdbWrapper"). The *gud* buffer
>> can be created successfully. The executable file can be loaded OK,
>> however, it reports some tty error while trying to run the executable:
>
> Does giving the -t option to ‘docker exec’ help in any way? (I did not
> test this; just a hunch because something seems to expect a tty and -t
> causes docker to allocate one.)
I tried that earlier (changed it to: docker exec -it ... ), it seems making the situation worse, : )
Beside the same error showing up when running it, I also found this new
error at the beginning of the buffer:
Error: you did not specify -i=mi on GDB's command line!
--
William
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2020-10-22 19:27 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-10-18 15:08 gdb mode with gdb command from the docker William Xu
2020-10-18 15:57 ` Eli Zaretskii
2020-10-18 18:18 ` William Xu
2020-10-18 18:35 ` Eli Zaretskii
2020-10-20 19:54 ` William Xu
2020-10-21 16:10 ` Eli Zaretskii
2020-10-22 18:41 ` William Xu
2020-10-22 18:49 ` Eli Zaretskii
2020-10-22 19:27 ` William Xu
2020-10-18 18:48 ` Yuri Khan
2020-10-18 19:00 ` otadmor
2020-10-19 6:41 ` William Xu
2020-10-19 6:39 ` William Xu
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).