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以上なプロジェクトならね。

このブログ記事について

このページは、らるるが2019年2月24日 20:32に書いたブログ記事です。

ひとつ前のブログ記事は「Linux memo 2019/02/17」です。

次のブログ記事は「Linux memo 2019/03/15」です。

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

月別 アーカイブ

ウェブページ

Powered by Movable Type 7.9.0