The keyboard unit

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

The keyboard unit

Kevin Lyda
When I compile and run this small test program (
https://gist.github.com/lyda/2d33a6d91067e9dffb4ed37147b52583 ) the
following happens:

% fpc test.pas
Free Pascal Compiler version 3.0.4+dfsg-22~bpo9+2 [2019/02/22] for x86_64
Copyright (c) 1993-2017 by Florian Klaempfl and others
Target OS: Linux for x86-64
Compiling test.pas
Linking test
/usr/bin/ld.bfd: warning: link.res contains output sections; did you forget -T?
7 lines compiled, 0.1 sec

% ./test
Runtime error 106 at $000000000042968D
  $000000000042968D
  $000000000040018C

If I remove the uses clause it runs fine.  Why is the keyboard unit,
which isn't even being used, causing this error?

Kevin

--
Kevin Lyda
Galway, Ireland
_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: The keyboard unit

Ralf Quint
On 5/10/2019 4:42 PM, Kevin Lyda wrote:

> When I compile and run this small test program (
> https://gist.github.com/lyda/2d33a6d91067e9dffb4ed37147b52583 ) the
> following happens:
>
> % fpc test.pas
> Free Pascal Compiler version 3.0.4+dfsg-22~bpo9+2 [2019/02/22] for x86_64
> Copyright (c) 1993-2017 by Florian Klaempfl and others
> Target OS: Linux for x86-64
> Compiling test.pas
> Linking test
> /usr/bin/ld.bfd: warning: link.res contains output sections; did you forget -T?
> 7 lines compiled, 0.1 sec
>
> % ./test
> Runtime error 106 at $000000000042968D
>    $000000000042968D
>    $000000000040018C
>
> If I remove the uses clause it runs fine.  Why is the keyboard unit,
> which isn't even being used, causing this error?
>
> Kevin
>
Away from any computer with FreePascal installed, but could it be that
this is a non-Linux aware unit which does something DOS-specific (as you
select TP mode), which of course doesn't work under Linux...

Ralf


---
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: The keyboard unit

Alexander Grotewohl
In reply to this post by Kevin Lyda
if it's not being used, remove it :)

but really though, do any of the fleshed out examples on the website work? like the one from here?:
https://www.freepascal.org/docs-html/rtl/keyboard/getkeyevent.html

--
Alexander Grotewohl
http://dcclost.com

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: The keyboard unit

Ralf Quint
In reply to this post by Kevin Lyda
On 5/10/2019 4:42 PM, Kevin Lyda wrote:
> If I remove the uses clause it runs fine.  Why is the keyboard unit,
> which isn't even being used, causing this error?
>
> Kevin

Well, when I got home a short while ago, I tried that small test program
on one of my Linux workstations and it runs just fine...

FPC 3.04 as installed with Lazarus 2.02 (ok, installed the 3 .deb
packages for fpc, fpc-source and lazarus 2.02 from the lazarus
SourceForge repo), compiled and running on Linux Mint 19.2/64, tried
both Cinnamon and Mate, on two different hosts...

Ralf


---
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: The keyboard unit

Kevin Lyda
Ralf, thanks! That was the idea, a small easy to test program.

[NOTE: this email was a log of me debugging. If you want to skip to
the issue: it's because the keyboard unit dies when running under tmux
because /proc/PID/stat is harder to parse than the keyboard unit code
assumes.]

My setup is similar but slightly different: Ubuntu 18.04 and just
using a Makefile and the commandline compiler. Am I missing a flag?
When I run these:

strace -o argh ./test
strace -o argh ./test-without-keyboard

diff -u argh*
--- argh        2019-05-11 08:24:54.015836828 +0100
+++ argh2       2019-05-11 08:25:21.377836828 +0100
@@ -9,26 +9,6 @@
 ioctl(1, TCGETS, {B38400 opost isig icanon echo ...}) = 0
 ioctl(2, TCGETS, {B38400 opost isig icanon echo ...}) = 0
 readlink("/proc/self/exe", "/home/kevin/src/sandbox/older/fp"..., 255) = 45
-getpid()                                = 2158
-mmap(NULL, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS,
-1, 0) = 0x7bcbfb894000
-open("/proc/2158/stat", O_RDONLY|O_LARGEFILE) = 3
-read(3, "2158 (test) R 2156 2156 14867 34"..., 256) = 256
-close(3)                                = 0
-open("/proc/2156/stat", O_RDONLY|O_LARGEFILE) = 3
-read(3, "2156 (strace) S 14867 2156 14867"..., 256) = 256
-close(3)                                = 0
-mmap(NULL, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS,
-1, 0) = 0x7bcbfb88c000
-open("/proc/14867/stat", O_RDONLY|O_LARGEFILE) = 3
-read(3, "14867 (zsh) S 522 14867 14867 34"..., 256) = 256
-close(3)                                = 0
-open("/proc/522/stat", O_RDONLY|O_LARGEFILE) = 3
-read(3, "522 (tmux: server) S 131 522 522"..., 256) = 256
-write(2, "Runtime error 106 at $0000000000"..., 39) = 39
-write(2, "  $000000000042968D\n", 20)   = 20
-ioctl(2, TCGETS, {B38400 opost isig icanon echo ...}) = 0
-write(2, "  $000000000040018C\n", 20)   = 20
-write(2, "\n", 1)                       = 1
-munmap(0x7bcbfb88c000, 32768)           = 0
-munmap(0x7bcbfb894000, 32768)           = 0
-exit_group(106)                         = ?
-+++ exited with 106 +++
+write(1, "Hello World.\n", 13)          = 13
+exit_group(0)                           = ?
++++ exited with 0 +++

OK, so it seems to read through the ancestors of its process and dies
when it reads the /proc/PID/stat of the tmux process. So, what if I
run it without tmux: strace -o argh3 ./test which runs fine and exits
cleanly. So what's the difference? diff -u argh{,3}

--- argh        2019-05-11 08:24:54.015836828 +0100
+++ argh3       2019-05-11 08:40:16.456836828 +0100
@@ -9,26 +9,31 @@
 ioctl(1, TCGETS, {B38400 opost isig icanon echo ...}) = 0
 ioctl(2, TCGETS, {B38400 opost isig icanon echo ...}) = 0
 readlink("/proc/self/exe", "/home/kevin/src/sandbox/older/fp"..., 255) = 45
-getpid()                                = 2158
-mmap(NULL, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS,
-1, 0) = 0x7bcbfb894000
-open("/proc/2158/stat", O_RDONLY|O_LARGEFILE) = 3
-read(3, "2158 (test) R 2156 2156 14867 34"..., 256) = 256
-close(3)                                = 0
-open("/proc/2156/stat", O_RDONLY|O_LARGEFILE) = 3
-read(3, "2156 (strace) S 14867 2156 14867"..., 256) = 256
-close(3)                                = 0
-mmap(NULL, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS,
-1, 0) = 0x7bcbfb88c000
-open("/proc/14867/stat", O_RDONLY|O_LARGEFILE) = 3
-read(3, "14867 (zsh) S 522 14867 14867 34"..., 256) = 256
-close(3)                                = 0
-open("/proc/522/stat", O_RDONLY|O_LARGEFILE) = 3
-read(3, "522 (tmux: server) S 131 522 522"..., 256) = 256
-write(2, "Runtime error 106 at $0000000000"..., 39) = 39
-write(2, "  $000000000042968D\n", 20)   = 20
-ioctl(2, TCGETS, {B38400 opost isig icanon echo ...}) = 0
-write(2, "  $000000000040018C\n", 20)   = 20
-write(2, "\n", 1)                       = 1
-munmap(0x7bcbfb88c000, 32768)           = 0
-munmap(0x7bcbfb894000, 32768)           = 0
-exit_group(106)                         = ?
-+++ exited with 106 +++
+getpid()                                = 2719
+mmap(NULL, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS,
-1, 0) = 0x7f8092c23000
+open("/proc/2719/stat", O_RDONLY|O_LARGEFILE) = 3
+read(3, "2719 (test) R 2717 2717 2429 348"..., 256) = 256
+close(3)                                = 0
+open("/proc/2717/stat", O_RDONLY|O_LARGEFILE) = 3
+read(3, "2717 (strace) S 2429 2717 2429 3"..., 256) = 256
+close(3)                                = 0
+open("/proc/2429/stat", O_RDONLY|O_LARGEFILE) = 3
+read(3, "2429 (zsh) S 2427 2429 2429 3481"..., 256) = 256
+close(3)                                = 0
+open("/proc/2427/stat", O_RDONLY|O_LARGEFILE) = 3
+read(3, "2427 (ld-linux-x86-64) S 364 242"..., 256) = 256
+close(3)                                = 0
+open("/etc/timezone", O_RDONLY|O_LARGEFILE) = 3
+read(3, "Etc/UTC\n", 255)               = 8
+close(3)                                = 0
+open("/usr/share/zoneinfo/Etc/UTC", O_RDONLY|O_LARGEFILE) = 3
+read(3, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\0"...,
2048) = 127
+mmap(NULL, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS,
-1, 0) = 0x7f8092c1b000
+close(3)                                = 0
+time([1557560416])                      = 1557560416
+ioctl(1, TCGETS, {B38400 opost isig icanon echo ...}) = 0
+write(1, "Hello World.\n", 13)          = 13
+munmap(0x7f8092c1b000, 32768)           = 0
+munmap(0x7f8092c23000, 32768)           = 0
+exit_group(0)                           = ?
++++ exited with 0 +++

So the code that does this is in this:
/usr/share/fpcsrc/3.0.4/rtl/linux/linuxvcs.pp

I instrumented it a bit
(https://gist.github.com/b110dd08847fbd54e08e8bef803ac5d9) and I see
the issue:

/proc/5200/stat: 5200  (kbd-test) R 14867 5200 14867 34821
/proc/14867/stat: 14867  (zsh) S 522 14867 14867 34821
/proc/522/stat: 522  (tmux: server) Runtime error 106 at $00000000004006D8
  $00000000004006D8
  $0000000000400967
  $000000000040018C

The problem is that /proc/*/stat is kind of hard to parse as this code
proves - tmux has rewritten its argv[0] to have a space which breaks
the parser here.  And don't think the ")" is a delimiter as argv[0]
can have a ")" in it.  The format seems to imply it needs to be read
to the end of the line and parsed backwards:
https://www.redhat.com/archives/axp-list/2001-January/msg00355.html

In addition ttyname(3) is a POSIX function that would avoid this issue.

Kevin

On Sat, May 11, 2019 at 6:08 AM Ralf Quint <[hidden email]> wrote:

>
> On 5/10/2019 4:42 PM, Kevin Lyda wrote:
> > If I remove the uses clause it runs fine.  Why is the keyboard unit,
> > which isn't even being used, causing this error?
> >
> > Kevin
>
> Well, when I got home a short while ago, I tried that small test program
> on one of my Linux workstations and it runs just fine...
>
> FPC 3.04 as installed with Lazarus 2.02 (ok, installed the 3 .deb
> packages for fpc, fpc-source and lazarus 2.02 from the lazarus
> SourceForge repo), compiled and running on Linux Mint 19.2/64, tried
> both Cinnamon and Mate, on two different hosts...
>
> Ralf
>
>
> ---
> This email has been checked for viruses by Avast antivirus software.
> https://www.avast.com/antivirus
>
> _______________________________________________
> fpc-pascal maillist  -  [hidden email]
> http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal



--
Kevin Lyda
Galway, Ireland
_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: The keyboard unit

Kevin Lyda
And looking a bit further, I see this has been kind of addressed in r39579:

https://svn.freepascal.org/cgi-bin/viewvc.cgi?view=revision&revision=39579

The fix is imperfect - a process could have a ') ' in it, but it would
be unlikely. postfix and postgres appear to put a closing parens in
their argv[0] but always at the end.

So now I'm curious if a) working off fpc trunk is currently an OK idea
and b) if there are some good docs on doing that?

Kevin

On Sat, May 11, 2019 at 9:46 AM Kevin Lyda <[hidden email]> wrote:

>
> Ralf, thanks! That was the idea, a small easy to test program.
>
> [NOTE: this email was a log of me debugging. If you want to skip to
> the issue: it's because the keyboard unit dies when running under tmux
> because /proc/PID/stat is harder to parse than the keyboard unit code
> assumes.]
>
> My setup is similar but slightly different: Ubuntu 18.04 and just
> using a Makefile and the commandline compiler. Am I missing a flag?
> When I run these:
>
> strace -o argh ./test
> strace -o argh ./test-without-keyboard
>
> diff -u argh*
> --- argh        2019-05-11 08:24:54.015836828 +0100
> +++ argh2       2019-05-11 08:25:21.377836828 +0100
> @@ -9,26 +9,6 @@
>  ioctl(1, TCGETS, {B38400 opost isig icanon echo ...}) = 0
>  ioctl(2, TCGETS, {B38400 opost isig icanon echo ...}) = 0
>  readlink("/proc/self/exe", "/home/kevin/src/sandbox/older/fp"..., 255) = 45
> -getpid()                                = 2158
> -mmap(NULL, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS,
> -1, 0) = 0x7bcbfb894000
> -open("/proc/2158/stat", O_RDONLY|O_LARGEFILE) = 3
> -read(3, "2158 (test) R 2156 2156 14867 34"..., 256) = 256
> -close(3)                                = 0
> -open("/proc/2156/stat", O_RDONLY|O_LARGEFILE) = 3
> -read(3, "2156 (strace) S 14867 2156 14867"..., 256) = 256
> -close(3)                                = 0
> -mmap(NULL, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS,
> -1, 0) = 0x7bcbfb88c000
> -open("/proc/14867/stat", O_RDONLY|O_LARGEFILE) = 3
> -read(3, "14867 (zsh) S 522 14867 14867 34"..., 256) = 256
> -close(3)                                = 0
> -open("/proc/522/stat", O_RDONLY|O_LARGEFILE) = 3
> -read(3, "522 (tmux: server) S 131 522 522"..., 256) = 256
> -write(2, "Runtime error 106 at $0000000000"..., 39) = 39
> -write(2, "  $000000000042968D\n", 20)   = 20
> -ioctl(2, TCGETS, {B38400 opost isig icanon echo ...}) = 0
> -write(2, "  $000000000040018C\n", 20)   = 20
> -write(2, "\n", 1)                       = 1
> -munmap(0x7bcbfb88c000, 32768)           = 0
> -munmap(0x7bcbfb894000, 32768)           = 0
> -exit_group(106)                         = ?
> -+++ exited with 106 +++
> +write(1, "Hello World.\n", 13)          = 13
> +exit_group(0)                           = ?
> ++++ exited with 0 +++
>
> OK, so it seems to read through the ancestors of its process and dies
> when it reads the /proc/PID/stat of the tmux process. So, what if I
> run it without tmux: strace -o argh3 ./test which runs fine and exits
> cleanly. So what's the difference? diff -u argh{,3}
>
> --- argh        2019-05-11 08:24:54.015836828 +0100
> +++ argh3       2019-05-11 08:40:16.456836828 +0100
> @@ -9,26 +9,31 @@
>  ioctl(1, TCGETS, {B38400 opost isig icanon echo ...}) = 0
>  ioctl(2, TCGETS, {B38400 opost isig icanon echo ...}) = 0
>  readlink("/proc/self/exe", "/home/kevin/src/sandbox/older/fp"..., 255) = 45
> -getpid()                                = 2158
> -mmap(NULL, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS,
> -1, 0) = 0x7bcbfb894000
> -open("/proc/2158/stat", O_RDONLY|O_LARGEFILE) = 3
> -read(3, "2158 (test) R 2156 2156 14867 34"..., 256) = 256
> -close(3)                                = 0
> -open("/proc/2156/stat", O_RDONLY|O_LARGEFILE) = 3
> -read(3, "2156 (strace) S 14867 2156 14867"..., 256) = 256
> -close(3)                                = 0
> -mmap(NULL, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS,
> -1, 0) = 0x7bcbfb88c000
> -open("/proc/14867/stat", O_RDONLY|O_LARGEFILE) = 3
> -read(3, "14867 (zsh) S 522 14867 14867 34"..., 256) = 256
> -close(3)                                = 0
> -open("/proc/522/stat", O_RDONLY|O_LARGEFILE) = 3
> -read(3, "522 (tmux: server) S 131 522 522"..., 256) = 256
> -write(2, "Runtime error 106 at $0000000000"..., 39) = 39
> -write(2, "  $000000000042968D\n", 20)   = 20
> -ioctl(2, TCGETS, {B38400 opost isig icanon echo ...}) = 0
> -write(2, "  $000000000040018C\n", 20)   = 20
> -write(2, "\n", 1)                       = 1
> -munmap(0x7bcbfb88c000, 32768)           = 0
> -munmap(0x7bcbfb894000, 32768)           = 0
> -exit_group(106)                         = ?
> -+++ exited with 106 +++
> +getpid()                                = 2719
> +mmap(NULL, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS,
> -1, 0) = 0x7f8092c23000
> +open("/proc/2719/stat", O_RDONLY|O_LARGEFILE) = 3
> +read(3, "2719 (test) R 2717 2717 2429 348"..., 256) = 256
> +close(3)                                = 0
> +open("/proc/2717/stat", O_RDONLY|O_LARGEFILE) = 3
> +read(3, "2717 (strace) S 2429 2717 2429 3"..., 256) = 256
> +close(3)                                = 0
> +open("/proc/2429/stat", O_RDONLY|O_LARGEFILE) = 3
> +read(3, "2429 (zsh) S 2427 2429 2429 3481"..., 256) = 256
> +close(3)                                = 0
> +open("/proc/2427/stat", O_RDONLY|O_LARGEFILE) = 3
> +read(3, "2427 (ld-linux-x86-64) S 364 242"..., 256) = 256
> +close(3)                                = 0
> +open("/etc/timezone", O_RDONLY|O_LARGEFILE) = 3
> +read(3, "Etc/UTC\n", 255)               = 8
> +close(3)                                = 0
> +open("/usr/share/zoneinfo/Etc/UTC", O_RDONLY|O_LARGEFILE) = 3
> +read(3, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\0"...,
> 2048) = 127
> +mmap(NULL, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS,
> -1, 0) = 0x7f8092c1b000
> +close(3)                                = 0
> +time([1557560416])                      = 1557560416
> +ioctl(1, TCGETS, {B38400 opost isig icanon echo ...}) = 0
> +write(1, "Hello World.\n", 13)          = 13
> +munmap(0x7f8092c1b000, 32768)           = 0
> +munmap(0x7f8092c23000, 32768)           = 0
> +exit_group(0)                           = ?
> ++++ exited with 0 +++
>
> So the code that does this is in this:
> /usr/share/fpcsrc/3.0.4/rtl/linux/linuxvcs.pp
>
> I instrumented it a bit
> (https://gist.github.com/b110dd08847fbd54e08e8bef803ac5d9) and I see
> the issue:
>
> /proc/5200/stat: 5200  (kbd-test) R 14867 5200 14867 34821
> /proc/14867/stat: 14867  (zsh) S 522 14867 14867 34821
> /proc/522/stat: 522  (tmux: server) Runtime error 106 at $00000000004006D8
>   $00000000004006D8
>   $0000000000400967
>   $000000000040018C
>
> The problem is that /proc/*/stat is kind of hard to parse as this code
> proves - tmux has rewritten its argv[0] to have a space which breaks
> the parser here.  And don't think the ")" is a delimiter as argv[0]
> can have a ")" in it.  The format seems to imply it needs to be read
> to the end of the line and parsed backwards:
> https://www.redhat.com/archives/axp-list/2001-January/msg00355.html
>
> In addition ttyname(3) is a POSIX function that would avoid this issue.
>
> Kevin
>
> On Sat, May 11, 2019 at 6:08 AM Ralf Quint <[hidden email]> wrote:
> >
> > On 5/10/2019 4:42 PM, Kevin Lyda wrote:
> > > If I remove the uses clause it runs fine.  Why is the keyboard unit,
> > > which isn't even being used, causing this error?
> > >
> > > Kevin
> >
> > Well, when I got home a short while ago, I tried that small test program
> > on one of my Linux workstations and it runs just fine...
> >
> > FPC 3.04 as installed with Lazarus 2.02 (ok, installed the 3 .deb
> > packages for fpc, fpc-source and lazarus 2.02 from the lazarus
> > SourceForge repo), compiled and running on Linux Mint 19.2/64, tried
> > both Cinnamon and Mate, on two different hosts...
> >
> > Ralf
> >
> >
> > ---
> > This email has been checked for viruses by Avast antivirus software.
> > https://www.avast.com/antivirus
> >
> > _______________________________________________
> > fpc-pascal maillist  -  [hidden email]
> > http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
>
>
>
> --
> Kevin Lyda
> Galway, Ireland



--
Kevin Lyda
Galway, Ireland
_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal