2019年2月アーカイブ

Linux memo 2019/02/24

● gdbで使えるptmallocデバッグ用ツール
malloc SIGSEGV問題で困っていて調べてみると、
ptmallocのデバッグのために作られたPython binding用のライブラリ
https://github.com/cloudburst/libheap/
があったので試してみようと思った。例のごとPython有効なgdbが前提だったので、せっかくなのでPythonを有効にしたcross gdbも用意してみた。下記はざっくりとしたメモなのでコマンド1つ1つは正確じゃないかもしれない。

mkdir obj
cd obj
../gdb-8.2/configure --prefix=/home/rarul/usr --target=arm-linux-gnueabihf --with-python=/usr/bin/python3
make -j4
make install
libheapそのものについては中にReadme.mdとかInstallGuide.mdとかあるのでそれを参考にして入れて。
で、使ってみた感想、
  - x86_64前提なのかサイズやアドレス計算が一部合わない
 - ネイティブ実行を想定してるためgdbserverやcore-dump環境では使えないコマンドがある
  - というか自分でgdbの変数参照する方法でmain_arenaからたどるので十分じゃね?
うーん、うまくいかんね。もちろんValgrind使えればいいんだけど、組み込みだと、デバッグシンボルなかったりRAM足りなかったりCPU速度が足りなかったり、など。スペックに余裕のある開発環境なんて幻想ですね。
参考サイト、、
ARM Linuxのリモートデバッグ用にgdb 8.0.1 をソースからビルドする - Qiita
https://qiita.com/tetsu_koba/items/ddf93510b1f0997a8cd2
gdb-peda超入門 - Qiita
https://qiita.com/miyagaw61/items/248a486cca671686c58c
Raspberry Pi 用にGDBをクロスコンパイルしてリモートデバッグしてみた - mcommit's message
http://mcommit.hatenadiary.com/entry/2017/10/13/234932
バグをつぶさずにスタック クラッシュを再現:高度な脆弱性分析
https://gblogs.cisco.com/jp/2016/11/crashing-stacks-without-squishing-bugs/

● MALLOC_CHECK_環境変数
glibcで簡易mallocチェックしてくれるMALLOC_CHECK_環境変数の機能がある。
- MALLOC_CHECK_=0 で、何もしない(デフォルト)
- MALLOC_CHECK_=1 で、stderrにメッセージを出す
- MALLOC_CHECK_=2 で、異常検出時にabort()を呼ぶ
- MALLOC_CHECK_=3 で、1,2の両方をする
まぁ入れるなら普通は3かな。っと思いながら調べてると、いつもの安定のmasamiさんの記事がヒット、
φ(.. )メモシテオコウ eclipse + MALLOC_CHECK_=3でハマったという話
https://kernhack.hatenablog.com/entry/2013/10/17/212801
「MALLOC_CHECK_=3」は常習しとけってことですね、はい、それがいいと思います。

● ioremap() vs ioremap_nocache() vs ioremap_cache()
x86でのI/Oのキャッシュモデルと相まってどれがよいのか昔から論争があるみたい。
https://lwn.net/Articles/653585/
ioremap()という関数(マクロだけど)があるべき姿も実装も適切でないので、ioremap()を使うのは避けたほうが良さそう。ioremap_nocache()とかioremap_cache()かな?writethroughtの場合はどうなんだろ?memremap()がよいと上記記事には書いてあるんだけど、RAMじゃないんだよI/Oなんだよ、の場合とか。x86系だと最近はpcieやUSBだろうからあんま意識しないのかな。
で、あるべき論はともかく、x86前提での実装の影響を受けてか、armも少なからず迷走している。kernel/arch/arm/include/asm/io.hより、

* ioremap() and friends.
*
* ioremap() takes a resource address, and size. Due to the ARM memory
* types, it is important to use the correct ioremap() function as each
* mapping has specific properties.
*
* Function Memorytype Cacheability Cache hint
* ioremap() Device n/a n/a
* ioremap_nocache()Device n/a n/a
* ioremap_cache() Normal Writeback Read allocate
* ioremap_wc() Normal Non-cacheable n/a
* ioremap_wt() Normal Non-cacheable n/a
この表をarchごとに覚えろというわけですね、わかります。

● MLOCK_ONFAULT
Linux-4.4からmlock2()とMLOCK_ONFAULTが追加されてる。
mlockall(MCL_CURRENT|MCL_FUTURE)だとまだresidentになってない領域までmmapするだけでmlockされてRAMを圧迫する(使いもしない領域が多いshared libraryが致命的)だしどうしよ、と思っていたところ上記を発見。MLOCK_ONFAULTは便利そうで将来はぜひ検討してみたい、そうLinux-4.4以上なプロジェクトならね。

Linux memo 2019/02/17

● cross prelink
cross prelinkは32bitのarm Linuxの初期によく使われたが、各自が勝手にprelinkにパッチを当てて開発するスタイルだったようで、中央レポジトリが存在しなかった、仕方ないのでYocto Projectで管理することにしたよ、って書いてあった。
Cross-Prelink - Yocto Project (https://wiki.yoctoproject.org/wiki/Cross-Prelink)
prelink-cross - Cross capable Prelink (http://git.yoctoproject.org/cgit/cgit.cgi/prelink-cross/about/)

● ld.soの機能
環境変数LD_DEBUGでいろいろできる。ヘルプを出すには、$ LD_DEBUG=help ls など。
環境変数でLinuxのglibc動的リンカにログを出力させる (http://blog.kmckk.com/archives/4738685.html)
Linux の共有ライブラリの挙動について - daily dayflower (http://dayflower.hatenablog.com/entry/20080522/1211531665)
http://ukai.jp/debuan/2002w/elf.txt
Binary Hacksはもちろん今でも役に立つんだけど、なにせ10年以上前にその当時で「少し古い」情報も書かれた本なので、本当かどうかは実環境で裏付けしながらやったほうがよい。

● jiffiesの初期値
jiffiesの初期値は-5分、INITIAL_JIFFIESでgrepしてみて。
kernel/include/linux/jiffies.h#L174
このため「起動後1分だけ」という条件を書きたい場合、ktime_get_ts()あたりを使うのが良い。

● sqlite3_closeとsqlite3_close_v2()の違い
SQLiteは、こだわりがないのならばとりあえずv2のほうを必ず使っとけ。
Closing A Database Connection (https://www.sqlite.org/c3ref/close.html)
objective c - sqlite3_close_v2 crashes on iOS, sqlite3_close doesn't - Stack Overflow
【SQLite C/C++ API】sqlite3, sqlite3_stmtオブジェクトの解放忘れを防ぐ(C++) - Qiita

● IPパケットのDSCP
IPパケットのToSフィールドにDSCPを設定したい場合、iptablesで設定する方法が主流みたいだけど、その場合CONFIG_NETFILTER_XT_MATCH_DSCP が必要になる。
https://elixir.bootlin.com/linux/v3.10.108/source/net/netfilter/Makefile#L112
https://elixir.bootlin.com/linux/v3.10.108/source/net/netfilter/xt_dscp.c
Linux の iptables で OUTPUT 方向のパケットに ToS を設定する - Qiita
ネットワーク屋さんじゃないから正直詳しくない。

● Liuxでの待ち合わせの種類
wait_event()とwake_up()、wait_for_completion()とcomplete()、あともう1種類あった気がするけど忘れた。いつもすぐに思い出せないし、思い出しても排他処理の書き方で長時間悩んでしまう。
1.7 事象の待ち合わせ

● シリアルコンソール用のツール
- cu
- screen
- kermit
- minicom
WindowsだとTeraTerm一択だけど、Linuxだと意外と定番というのがなさげ?screenも使えるのは意外だった。ここで私の使ってる.kermrcを晒しておきたいところだけど、kermitに限らず設定ファイルをさらす(というか自分用にいつでも参照できるようにしたい)予定で考えてるので、ここではやめとく。Githubにsettingレポジトリを置くのが良いかも。

● priority inheritance
優先度継承は古典的だけど今でも頭を悩ます問題。例えば、itronのmtxは優先度継承するがsemはしない、など。Linux kernelでもどうなってるのかを調べないといけないことが今後出てきそう。
このへん?(kernel/Docuentation/locking/rt-mutex.txt)
なんかLinusが優しく吠えてた

このアーカイブについて

このページには、2019年2月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2019年1月です。

次のアーカイブは2019年3月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

月別 アーカイブ

ウェブページ

Powered by Movable Type 7.5.0