Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-pascal / 2019-05

The keyboard unit

6 messages · 3 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

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

Reply by email

Ralf Quint
to Kevin Lyda
Kevin Lyda wrote 23 lines
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

Reply by email

Ralf Quint
to Kevin Lyda: When I compile and run this small test program (…
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

Reply by email

Kevin Lyda
to Ralf Quint

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

AM Ralf Quint wrote 25 lines
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 - http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
Kevin Lyda Galway, Ireland

Reply by email

Kevin Lyda
to 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

AM Kevin Lyda wrote 176 lines
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 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 - > http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal -- Kevin Lyda Galway, Ireland
Kevin Lyda Galway, Ireland

Reply by email