Changes
Page history
Update debugging
authored
Dec 18, 2024
by
umaumax
Show whitespace changes
Inline
Side-by-side
debugging.md
View page @
4fc5fddd
...
...
@@ -22,6 +22,7 @@ unshare --mount --map-root-user bash -c "mount --bind --make-private "$TMP_HOSTS
*
ライブデバッグ: プロセスにアタッチしてリアルタイムに行う
*
ポストモーテムデバッグ: e.g. coredumpを利用してポストモーテム(死後)に行う
### バグに対処する対策のステップについて考える
*
バグをそもそも作らない
...
...
@@ -30,6 +31,7 @@ unshare --mount --map-root-user bash -c "mount --bind --make-private "$TMP_HOSTS
*
3-1. バグの解析をしやすくするか
*
3-2. 再現のしやすさ
### デバッグを快適にするためには
*
アクセス
...
...
@@ -41,6 +43,7 @@ unshare --mount --map-root-user bash -c "mount --bind --make-private "$TMP_HOSTS
*
何かの処理中に変更差分を再デプロイしても辻褄が合う(冪等性がある)
*
簡単に環境をデプロイできて、TATが短いとよい
## サンプルファイル
### .zip, .tar.gz
...
...
@@ -130,6 +133,7 @@ str_or_u8_slice
*
[
cpp-examples/md5.cpp at master · umaumax/cpp-examples
](
https://github.com/umaumax/cpp-examples/blob/master/hash/md5.cpp
)
*
[
cpp-examples/sha1.cpp at master · umaumax/cpp-examples
](
https://github.com/umaumax/cpp-examples/blob/master/hash/sha1.cpp
)
required:
```
bash
...
...
@@ -158,6 +162,7 @@ sha1_smol::Sha1::from(&str_or_u8_slice).digest()
*
どこまで問題ないかどうかを実際に手を動かして細かく切り分けすること(ある程度当たりはつけても良いが、枝刈りをしすぎると、見落としに全然気が付かなくなることに注意)
*
具体的なエラーの内容に囚われすぎずに、バージョンの不一致や環境差分、設定など広い範囲についても考えるとよい
## システム全体の挙動を解析したい
### ある一定期間の間に実行されたすべてのコマンドを取得したい
...
...
@@ -195,6 +200,7 @@ sudo lsof -p $PID
*
利用している動的ライブラリの情報も取得できる
*
特に、ログファイルが一発でわかる
### 特定のプロセスの動きを一時的に停止したい
```
bash
...
...
@@ -225,6 +231,7 @@ pidstat -w 1 -p $PID
*
直接ファイルパス指定で起動するケースでも置換可能
*
ただし、元のファイルが呼べなくなる
### g++コマンドの引数のトレース
`cxx.sh`
...
...
@@ -296,10 +303,12 @@ Content-Length: 297\r
2.
(この時点で、ポートへのアクセスを受け付け始める)
3.
特定のパス(e.g.
`/health`
)の待受が完了する
*
**上記の2番の状態でクライアントが接続している場合に、ソケットのタイムアウト設定がない場合には永久に待機状態となる場合があることに注意**
*
タイミング問題であるので、サーバが完全に起動した後でデバッグをしても、気が付かないことに注意
*
仮説としては、3番まで起動しているが、
`keep-alive`
の影響で永久待機状態となっていると思いながらデバッグしていた
## 目的別
### 特定の共有ファイルを利用しているプロセス一覧
...
...
@@ -322,6 +331,7 @@ ps $(grep /lib/x86_64-linux-gnu/libnss_files-2.23.so /proc/*/maps | cut -d / -f3
*
`CFLAGS += -D_FORTIFY_SOURCE=1 -fstack-protector-strong`
*
[
全てのプログラムに gcc の -D_FORTIFY_SOURCE と -fstack-protector オプションが効くわけではない話 | かわうそ通信
](
https://konpeitoh.net/tech/stack-protector_20220724/
)
## 各スレッドがどのようなスレッドかどうかを知りたい
### あるプロセスの各スレッドで実行した動的リンクした関数の一覧を取得して,図示したい
...
...
@@ -404,6 +414,7 @@ find . -name "*.so" | xargs -n1 -I{} bash -c "echo {}; strings {} | md5sum"
*
実際に、異なる環境でビルドした結果でも上記のように
`strings`
を通すと一致する場合があったが、これは、あくまでも、デバッグの目安にしかならず、確実性はないことに注意
*
`strings`
を行う前に
`strip`
をかませるとよいかもしれない(
`strip`
は指定したファイル自体に変更を加えることに注意)
バイナリファイルかどうかは
`-executable`
の他に拡張子が
`.sh`
であるファイルも対象になることに注意
### buildできない or 意図しない実行結果となる
...
...
@@ -411,6 +422,7 @@ find . -name "*.so" | xargs -n1 -I{} bash -c "echo {}; strings {} | md5sum"
*
`git checkout`
をした後にそのままbuildした場合
*
`git rebase`
をした後にそのままbuildした場合
上記,依存関係の設定が不完全な
`make`
でよく起こり得る
### バイナリコマンドの差分検出
...
...
@@ -424,6 +436,7 @@ find . -name "*.so" | xargs -n1 -I{} bash -c "echo {}; strings {} | md5sum"
*
`strip -s`
コマンドでヘッダ情報を削除する
*
`objdump -x`
or
`objdump -d`
でdiffをとる
#### 既存ツール
[
elfdiff - マニュアルページ セクション 1: ユーザーコマンド
](
https://docs.oracle.com/cd/F16635_01/html/E71065/elfdiff-1.html
)
...
...
@@ -474,6 +487,10 @@ NTPサーバは正しく設定すること
そうしないと,
`make`
で正しく差分ビルドされなくなることに注意
### ビルドモードを切り替えるときは基本的にキャッシュを考慮してクリーンビルドすること
なるべく、
`git clone`
からやり直すことを強く推奨する
### ウェブからのコピペしたコマンドの動作がおかしい(スペースが怪しい場合)
[
C2A0問題を解決する
](
https://lab.unicast.ne.jp/2013/10/22/fix-c2a0-problem/
)
...
...
@@ -501,6 +518,7 @@ HWの割り込み処理などはCPU0に集中するような設定になって
*
他のユーザや自分が
`tmux`
経由でログインしているときに、プロセスが動いているままの可能性はないか?
*
特に、あるプログラムを動かして、一定時間後に
`pkill`
する場合に、他のユーザの権限で動作しているプログラムの方が若いPIDだと、
`pkill`
の処理がそこで止まる疑惑がある =
\>
いや,signal自体はすべての該当プロセスに飛ぶので,これは関係ない
### 特定の実行ファイルを決まった場所に配置する運用で、`Text file busy`を回避したい
予め、シンボリックリンクで実行ファイルを参照する形式にしておいて、その参照先を差し替える形式とすればよい
...
...
@@ -514,6 +532,7 @@ HWの割り込み処理などはCPU0に集中するような設定になって
*
長時間稼働するプロセスならば、外部から観測する
*
短い時間に、一気にメモリが利用される場合は外部からの観測では傾向がわからないので、内部から観測できるようにする
例えば、
`std::bad_alloc`
の例外を補足して、プロセスを停止すれば、その時点の
`/proc/buddyinfo`
などを観測できる
具体的な方法として、
`LD_PRELOAD`
で
`new`
を置き換えて、その中で、try catchして、
`raise(SIGSTOP)`
して停止している状態で
`cat /proc/buddyinfo`
を見る
...
...
@@ -560,6 +579,7 @@ int main() {
*
予想不能な不可解な場合は個のケースが多い
*
特に、intの型やStringに対して
`c_str()`
を使わずに、
`%s`
とするパターンが多い
### 例外が発生した箇所(try-catchしている場合を含む)のスタックトレースを取得したい
[
tnakagome/exray: Show stack traces from C++ exceptions at run-time without rebuilding target applications
](
https://github.com/tnakagome/exray
)
...
...
@@ -575,6 +595,7 @@ int main() {
*
Macの
`pboard`
プロセスが暴走するとGUIが固まる
*
ほかマシンからのsshは可能
### 見た目が同じなのに挙動がおかしい(文字コードが異なるパターン)
e.g. 見た目が同じ文字でも中身が異なるとハッシュタグで弾かれる場合がある
...
...
@@ -605,6 +626,7 @@ echo 'ごはん' | hexdump -C # こ+゙
*
A.
`/proc/<PID>/exe`
をコピーする
*
B.
`/proc/<PID>/maps`
を参照して、
`dd`
コマンドでコピーする
## 負荷をかけたい
### CPU
...
...
@@ -634,6 +656,7 @@ stressコマンド
*
非同期APIの結果待ちなど
*
スレッド起動後の処理タイミングが想定と異なる(テスト特有の立ち上げてからすぐに終了するようなケース)
\*
e.g. condition variableのwaitが行われる前にnotifyが行われ、ずっとwaitし続けるなど
## 再現
### gdb実行時にSEGVなどが再現しなくなる場合は、普通に実行し、coredumpする設定とすれば良い
...
...
...
...