lldb

Arduinoで格闘ロボットを自作できる!「二足歩行ロボット自作ガイド」が発売

なんてのが出てたので、読んでみた。

戦いのリングは、日本プロレス連盟じゃなくて、 ROBO-ONE という所でやってる。剣道部門があったりして、面白い。足裏以外がマットにつくとダウンって事になる。10カウントのうちに立ち上がるんだぞ、ロッキー。

ってな事で、どんな風に転んでも立ち上がる事が必至だ。知らない間に世の中進歩してるのね。

ちょっと昔の記事だけど、 浅草ギ研 ROBO-ONEへの道(二足歩行ロボット製作日記)なんてのが公開されてた。舞台裏は大変なのね。

2足歩行ロボットの製作

二足歩行ロボット (個別作品ページ)

こちらは、業界で使われている、昆虫みたいなロボット

四足歩行ロボ「SpotMini」が建設現場を自律巡回

こんなのが、鉄砲持って、戦場を駆け回るのか、怖いな。自動運転の車をみんな期待してるけど、これも怖い。怖さを想像してください。鉄砲を積むんじゃなくて、爆発物と言えば、怖さが想像できるでしょう。

追試2

前回は、思わずウブを試してしまったけど、Debianではどうよ? 注目ポイントは、無線LANが11ac相当の働きをするかどうか?

どうせやるなら、KDEを選んでみよう。ライブ版を試す。

案の定、firmwareが入っていないんでダメだよとdmesgに出て来た。 リポジトリを追加だな。面倒なんで、i386なマシンの/etc/apt/sources.listを持ってきちゃえ。それから、おもむろに

sudo apt-get install firmware-iwlwifi

接続editorとかで、wifiを追加すればいいんだな。近傍の無線局のssidが出てこない。

初心者でもできた!無料WiFiの設定。Linux Kubuntu 16.04

予定では、出てくるはずなんですけどね。firmwareを入れたら、一度rebootってのが、お約束 らしいけど、それをやっていないからなあ。wifiなNICが動かないんだろう。

でも、rebootすると、折角入れたfirmwareが消えちゃうし。どうするのが正解?

それはそうと、重いと覚悟してたKDEだけどUbuntuよりも軽いと感じるのは、オイラーだけ?

DebianでWifiのドライバをインストールする。

ああ、こういうページもあるな。みんな考える事は一緒。

sakae@ub:~$ du -sh /lib/firmware/
270M    /lib/firmware/

OpenBSDでは、50Mだったから、どんだけ色々集めているんだよ。ウブはユーザーの利便性を考えて、集められるのを全部集めて最初から入れてるんだな。

ふと、i386なマシンに入れてるDebianのそれを確認したら、45Mぐらいだった。必要なもの だけを入れれば、そんな容量なんだろうね。

FreeBSD 11.2

予定通り、先月の末に新しいのが出た。少し熱気が冷めた頃に入れるのさ。それはそれでいいんだけど、プチ不安になる事が。。。

何時も、/tmpはRAMに追いやっているんだ。何時もは/etc/fstabを古いやつから引っ張ってきてるんだけど、今回は古い方を先に消しちゃったんで、コピペの元ネタが無い。 適当にmanを見て

sakae@fb:~ % cat /etc/fstab
# Device        Mountpoint      FStype  Options Dump    Pass#
/dev/ada0s1a    /               ufs     rw      1       1
/dev/ada0s1b    none            swap    sw      0       0
tmpfs           /tmp            tmpfs   rw,mode=1777    0 0

こんな風にでっちあげた。元は、Optionの所にsize=1gが入っていたんだけどね。 今回はそれを省いた。文句を言われるかと思ったら、何のおとがめも無し。涼しい顔をして

sakae@fb:~ % df -h
Filesystem      Size    Used   Avail Capacity  Mounted on
/dev/ada0s1a     15G    3.2G     10G    24%    /
devfs           1.0K    1.0K      0B   100%    /dev
tmpfs           2.6G    4.0K    2.6G     0%    /tmp

2.6Gまで使えますってさ。本当は、dmesgを見ると

real memory  = 2147418112 (2047 MB)
avail memory = 2036293632 (1941 MB)

2Gのシステムなんだけどね。/tmpをどんどん圧迫していったら、FreeBSDは発狂するんだろうか? いつか墓穴を掘ってみたいな。

date

VirtualBoxにFreeBSDを入れたんだけど、dateすると、未来の時刻を表示する。ちゃんとJSTにはなっているんだけどね。はて、どうしたものか? 3秒考えて、前回のntpdateってのを思い出した。強引に、小金井の時計に合わせちゃえ。どこにそいつを突っ込む?

面倒だから、/etc/rcでいいしょ。

sakae@fb:/tmp % tail -5 /etc/rc

echo ''
ntpdate ntp.nict.jp
date
exit 0

たまには、こういう無茶ぶり。これで、いつでも正しい時刻を表示するぞと思っていたら、悪行の証拠が残ってた。

sakae@fb:/tmp % last
shutdown time                              Tue Jul  3 16:23
root       ttyv0                           Tue Jul  3 15:17 - 16:23  (01:06)
boot time                                  Wed Jul  4 00:13
 :

7月4日の深夜にマシンを立ち上げたにもかかわらず、ログインしたのは3日の午後3時過ぎという矛盾。鋭いデカだと、突っ込んでくるだろうね。だったら、もう少し、時刻合わせする場所の辻褄を合わせておけよ。

オイラーのかすかな記憶では、この矛盾を解決する方法があったはず。えーとね、えーとね、夏時間がどうのこうのってコマンドだったような。。

adjkerntz(8)

FILES
     /etc/localtime        Current zoneinfo file, see tzsetup(8) and zic(8).
     /etc/wall_cmos_clock  Empty file.  Its presence indicates that the
                           machine's CMOS clock is set to local time, while
                           its absence indicates a UTC CMOS clock.

BIOS時計がUTCになってるんなら、wall_cmos_clockファイルは必要無し。ローカル時間になってるなら、その事をFreeBSDに教える為に、空ファイルを作っとけ。ローカル時間で使ってるのは、天下のM$。普通人が使うOSだから、UTCなんて言われても意味不。だから、ローカル時間を採用か。

clangの新しい奴

今回のリリースの目玉だと、勝手に思っている。

sakae@fb:/tmp % cc -v hello.c
FreeBSD clang version 6.0.0 (tags/RELEASE_600/final 326565) (based on LLVM 6.0.0)
Target: x86_64-unknown-freebsd11.2
Thread model: posix
InstalledDir: /usr/bin
 "/usr/bin/cc" -cc1 -triple x86_64-unknown-freebsd11.2 -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -discard-value-names -main-file-name hello.c -mrelocation-model static -mthread-model posix -mdisable-fp-elim -masm-verbose -mconstructor-aliases -munwind-tables -target-cpu x86-64 -dwarf-column-info -debugger-tuning=gdb -v -resource-dir /usr/lib/clang/6.0.0 -fdebug-compilation-dir /tmp -ferror-limit 19 -fmessage-length 80 -fobjc-runtime=gnustep -fdiagnostics-show-option -fcolor-diagnostics -o /tmp/hello-f8163e.o -x c hello.c
clang -cc1 version 6.0.0 based upon LLVM 6.0.0 default target x86_64-unknown-freebsd11.2
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/clang/6.0.0/include
 /usr/include
End of search list.
 "/usr/bin/ld" --eh-frame-hdr -dynamic-linker /libexec/ld-elf.so.1 --hash-style=both --enable-new-dtags -o a.out /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtbegin.o -L/usr/lib /tmp/hello-f8163e.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/crtend.o /usr/lib/crtn.o

ldも独自のものが用意されてるかと思ったら、そうはなっていなかった。

What does 'debugger tuning' mean?

それより、面白いオプションが有るな。質問してる人が居た。FreeBSDでは、gdb信仰があるのか?

デフォで入っているgdbは、emacsと相性が悪いんだよな。

lldb

clang用のデバッガーが使えるそうなので、試してみる。

sakae@fb:/tmp % lldb a.out
(lldb) target create "a.out"
Current executable set to 'a.out' (x86_64).
(lldb) b main
Breakpoint 1: where = a.out`main + 18 at hello.c:5, address = 0x00000000004007b2
(lldb) r
Process 810 launching
Process 810 launched: '/tmp/a.out' (x86_64)
Process 810 stopped
* thread #1, name = 'a.out', stop reason = breakpoint 1.1
    frame #0: 0x00000000004007b2 a.out`main at hello.c:5
   2
   3    int main( )
   4    {
-> 5      printf("hello, world\n");
   6    }
   7
(lldb) bt
* thread #1, name = 'a.out', stop reason = breakpoint 1.1
  * frame #0: 0x00000000004007b2 a.out`main at hello.c:5
    frame #1: 0x0000000000400575 a.out`_start + 149

gdbと雰囲気が違うなあ。

(lldb) dis
a.out`main:
    0x4007a0 <+0>:  pushq  %rbp
    0x4007a1 <+1>:  movq   %rsp, %rbp
    0x4007a4 <+4>:  subq   $0x10, %rsp
    0x4007a8 <+8>:  movabsq $0x400816, %rdi           ; imm = 0x400816
->  0x4007b2 <+18>: movb   $0x0, %al
    0x4007b4 <+20>: callq  0x40049c                  ; symbol stub for: printf
    0x4007b9 <+25>: xorl   %ecx, %ecx
    0x4007bb <+27>: movl   %eax, -0x4(%rbp)
    0x4007be <+30>: movl   %ecx, %eax
    0x4007c0 <+32>: addq   $0x10, %rsp
    0x4007c4 <+36>: popq   %rbp
    0x4007c5 <+37>: retq

あっ、眼が腐るものを見ちゃった。さっさと先へ行きましょ。

(lldb) c
Process 810 resuming
hello, world
Process 810 exited with status = 0 (0x00000000)

親切っぽいな。

LLDB(1)                 FreeBSD General Commands Manual                LLDB(1)

NAME
     lldb - The debugger

SYNOPSIS
     lldb [-hvdexw] [-a arch] [-c core-file] [-l script-language]
          [-s lldb-commands] [-n process-name] [-p pid]
          [[--] <PROGRAM-ARG1> <PROGRAM-ARG2> ...]

DESCRIPTION
     lldb is the command line interface for the LLDB debugger library.  lldb
     can debug C, C++, Objective-C, and Objective-C++ programs.

冒頭付近。The debuggerとは、大きく出たものだな。a と The の違いは中学校の英語で習った記憶があるぞ。 gdbの方は、The GNU Debugger と、殊更GNUを強調。まあ、個性がありますよってぐらいに、緩く解釈しとけば良いのか。

詳しくはWebでってのが、CMの決まり文句なので、、、

The LLDB Debugger

そして、こちらの水は甘--いぞ、と誘っています。プロモーション大事!

GDB to LLDB Command Map

乗り換え案内中。

lldb + emacs

オイラーが常用してるemacsと組み合わせられるか?

Run gdb (like this): lldb -i=mi a.out

mini-bufferで、上記のように指定。

  Notes:

       Multiple "-s" and "-o" options can be provided.  They will be processed
       from left to right in order, with the source files and commands
       interleaved.  The same is true of the "-S" and "-O" options.  The before
       file and after file sets can intermixed freely, the command parser will
       sort them out.  The order of the file specifiers ("-c", "-f", etc.) is
       not significant in this regard.


       If you don't provide -f then the first argument will be the file to be
       debugged which means that 'lldb -- <filename> [<ARG1> [<ARG2>]]' also
       works.  But remember to end the options with "--" if any of your
       arguments have a "-" in them.

error: unknown or ambiguous option
Debugger finished

文句を言われて、あっけなく終了。

RMSがGNUのライセンスとBSDのライセンスが根本から違うから、lldbサポートするコードは、emacsに取り込まないよと主張してるみたい。

大体、llvmは、アプルがスポンサーになって発展してきたからなあ。水と油なのかな?

macの人の嘆きが聞こえるよ。

GUI

なんかlldbにguiなんてコマンドが有るよ。起動してみるか。

| LLDB (F1) | Target (F2) | Process (F3) | Thread (F4) | View (F5) | Help (F6) |
┌──<Sources>───────────────────────────────────────────────────┐┌──<Threads>───┐
│ a.out`main                                                   ││ ◆─process 794│
│ 1 │ #include <stdio.h>                                       ││              │
│ 2 │                                                          ││              │
│ 3 │ int main( )                                              ││              │
│ 4 │ {                                                        ││              │
│ 5 │◆  printf("hello, world\n"); <<< Thread 1: breakpoint 1.1 ││              │
│ 6 │ }                                                        ││              │
│ 7 │                                                          ││              │
┌──<Help>────────────────────────────────────────────────────────────────────┐ │
│ Welcome to the LLDB curses GUI.                                            │ │
│                                                                            │ │
│ Press the TAB key to change the selected view.                             │ │
│ Each view has its own keyboard shortcuts, press 'h' to open a dialog to dis│ │
│                                                                            │ │
│ Common key bindings for all views:                                         │ │
│                                                                            │ │
│        tab - Select next view                                              │ │
│          h - Show help dialog with view specific key bindings              │ │
│          , - Page up                                                       │ │
│          . - Page down                                                     │ │
│         up - Select previous                                               │ │
│       down - Select next                                                   │ │
│       left - Unexpand or select parent                                     │ │
│      right - Expand                                                        │ │
│    page-up - Page up                                                       │ │
│  page-down - Page down                                                     │ │
└───────────────────────────────────────────────────[Press any key to exit]──┘ │
│                                                              ││              │
└──────────────────────────────────────────────────────────────┘└──────────────┘
Process:   797    stopped               Thread: 100074      Frame:   0  PC = 0x0

Help画面に隠れちゃってるけど、Variablesのペインも有ったぞ。 使い易いんだか、使い難いんだか、微妙だな。gdbにも、これと似たようなのが有ったな。 確か、坂井さんのハロワ本で、多用してたな。

GUIとは直接関係無いけど、pythonのスクリプトとも仲良く出来るようだ。(生憎FreeBSDのlldbは、サポートコードが入っていない、残念バージョン)それから、リモートでdebugも出来るようだ。

これらがあれば、本当に本物のGUIからlldbを操れるだろう。gdbに追いつき追い越せ。そうじゃないと、スポンサーのアプルを満足させられないだろう。

src of lldb

ソースが付いているのが普通のBSD系なんで、拝んでおく。寄贈ソフトって事なんで、/usr/src/contrib/llvm から、ZoomInしてく。

sakae@fb:/usr/src/contrib/llvm/tools % ls
bugpoint        llvm-as         llvm-dwarfdump  llvm-nm         llvm-stress
clang           llvm-bcanalyzer llvm-extract    llvm-objcopy    llvm-symbolizer
llc             llvm-cov        llvm-link       llvm-objdump    llvm-xray
lld             llvm-cxxdump    llvm-lto        llvm-pdbutil    opt
lldb            llvm-cxxfilt    llvm-lto2       llvm-profdata
lli             llvm-diff       llvm-mc         llvm-readobj
llvm-ar         llvm-dis        llvm-modextract llvm-rtdyld

tool-chainが俯瞰できるな。更にZoomIn。

sakae@fb:/usr/src/contrib/llvm/tools/lldb/source % ls Plugins/Language
CPlusPlus       Java            ObjC
Go              OCaml           ObjCPlusPlus

manでは、Cフラフラ語とかアプル寄りの言語しかサポートしてないようだったけど、内職でJava語やGo語やOcaml語もサポートするようにコードを書いているんだな。

LinuxとWindowsを狙うマルウエアWellMess(2018-06-28)を見ると、golangを使ってマルウェアが開発されてたようだけど、debugにはlldbを使ったのかな?

そんな事よりソースはどうした? Cフラフラ語だから敬遠です。その代わりに

wall_cmos_clockの現場

を押さえる事にします。C語ですからね。まさかas語は出てこないでしょう。

sakae@fb:/sys % find . | xargs grep -l wall_cmos_clock
./dev/tws/tws_services.h
./mips/include/clock.h
./fs/smbfs/smbfs_subr.c
./kern/subr_clock.c

ふむ、上記に表われているな。

/*
 * The adjkerntz and wall_cmos_clock sysctls are in the "machdep" sysctl
 * namespace because they were misplaced there originally.
 */
static int adjkerntz;
static int
sysctl_machdep_adjkerntz(SYSCTL_HANDLER_ARGS)
{
        int error;
        error = sysctl_handle_int(oidp, oidp->oid_arg1, oidp->oid_arg2, req);
        if (!error && req->newptr)
                resettodr();
        return (error);
}
SYSCTL_PROC(_machdep, OID_AUTO, adjkerntz, CTLTYPE_INT | CTLFLAG_RW |
    CTLFLAG_MPSAFE, &adjkerntz, 0, sysctl_machdep_adjkerntz, "I",
    "Local offset from UTC in seconds");

int
utc_offset(void)
{

        return (tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0));
}

ここまで分かれば、これでどうよ?

sakae@fb:~ % sysctl -a | grep wall_cmos_clock
machdep.wall_cmos_clock: 1
sakae@fb:~ % sysctl -a | grep adjkerntz
machdep.adjkerntz: -32400
sakae@fb:~ % bc
32400 / 3600
9

これにて、一件落着。本当にそれだけで良いんか? /sbin/adjkerntzとかも見ておけ。

JST

上のdateの所で小金井なんてのが出てきた。何それ? 日本標準時の製造現場がある場所さ。 ついでに、明石って所は、東経135度の場所。地球はぐるっと一回りすると360度。それを24(時間)で割れば、15度になる。

15度違えば1時間の時差があるって事。東経(西経)の基準は、かの大英帝国が有った場所。イギリスのグリニッジがその場所となる。世界の時間の基準点、GMT。

地球が丸い事を証明しようと、かのコロンブスが旅立った。なんてのは、表向きの理由。領土の分捕り合戦。北アメリカは、イギリスとフランスだかで領地を分けた。北アメリカはもう分捕る場所が無いってんで、南アメリカに進出したのはスペイン。インカを滅ぼし、我物顔。

今は地球で分捕る場所が無いってんで、ネットの上での分捕り合戦。ブラウザーを無料でばらまき、検索という羅針盤を制覇、メールまで無料で提供。

httpはセキュリティー上好ましく無いと言う、誰も反対する理由が無い事に眼をつけ、強引にhttpsへ誘導。ネット上の帝国をどんどんと築いてますなあ。

そうなると、眠れる獅子は、眼の上に眼をつけざるを得ない。まずは、月に資源を求めようと、やっきになっている。昔、月に人類が降り立ったけど、大した実用性は無かった。早くコロニーを作った者が覇者となる。

月だけでは無い。海の中にもお宝は沢山眠っているはず。ならば、何とかしようと、色々と基地を建設。大変な競争ですなあ。

余り書くと、あれなので、このぐらいにしておくか。結城さんの数学ガールシリーズで、ポアンカレ予想なんて本を読み始めたんだけど、まだら模様にしか理解出来ないぞ。脳が軟化し始めたか、心配。