[デバッグ] Linux | GDP | straceでプログラムのデッドポジションを確認する方法

1. strace -p [プロセス番号]

strace -p 1002297

strace: Process 1002297 attached
futex(0x7fcbb95f3f84, FUTEX_WAIT_PRIVATE, 1, NULL

futex(0x7fcbb95f3f84、FUTEX_WAIT_PRIVATE、1、NULLで死亡したことがわかります

 

straceを使用して、プロセスがスタックした原因の例を見つけます

 

最近、プロセスがスタックする状況に遭遇しましたが、デバッグの過程で自分で再現できない場合があります。一定期間実行した後、特定の条件下でのみトリガーされます。このような状況では、操作によってシーンが損傷することはありません。gdb-pとstrace-pを使用して追跡できます。


まず、ps auxfを使用してプロセスが実行された場所確認します

実行がdockerexec -i 178.20.1.229_0115034556 lsに到達し、スタックしていることがわかります。


次に、さらにstraceを使用て、どのシステムコールバックこの操作実行したか確認します

ここに写真の説明を書いてください

ここでは、システムコールバックの読み取りでデッドであることがわかります。記述子19の特定の意味は、/ proc / pid / fdと入力することで確認できます。

19がパイプを表していることがわかります。ここでは、読み取りパイプで死んでいます。
/ ************************************************* ************************************************** ***************************** /
分割行、この問題は後で再び発生します。
最初にpsauxfを使用してプロセス番号とプロセスが実行されましたどのステップで、プロセス番号が27678であることがわかります。これは、dockerexecでスタックしています。

root 27678 0.3 0.4 512172 16500 Sl python /wns/cloud/app/com_host/main.pyc
root 25011 0.0 0.0 4332 652 S \ _ / bin / sh -c docker exec -i mongo_docker_master ls
root 25014 0.0 0.2 136592 10600 Sl         \ _ docker exec -i mongo_docker_masterls

strace-p 27678で追跡を続け、読み取りスタックし、ファイル記述子が14であることがわかりました。

root @ localhost:/#strace -p 27678      
プロセス27678添付
read(14、

次にcd / proc / 27678 /、ここでプロセスステータスを表示できます

ルート@ localhostの:/ procの/ 27678猫のステータス 
名:Pythonの
状態:S(睡眠)
TGID:27678
Ngid:0
はPid:27678
PPID:27677

ビューのデバッグ情報プロセスのカーネルスタックWCHANのプロセスを引き起こした関数を表し寝るか待つ

ルート@ localhostの:/ procの/ 27678猫スタック 
[<ffffffff811a91ab>] pipe_wait + 0x6b / 0x90を
[<ffffffff811a9c04>] pipe_read + 0x344 / 0x4f0
[<ffffffff811a00bf>] do_sync_read + 0x7fの/ 0xb0
[<ff0ff> 0x130
[<ffffffff811a1110> ] SyS_read + 0x80 /​​ 0xe0
[<ffffffff818d4c49>] system_call_fastpath + 0x16 / 0x1b
[<ffffffffffffffff>] 0xffffffffffffffff
root @ localhost:/ proc / 27678cat wchan 
pipe_wait

now 14それは何のですか、パイプファイル

root @ localhost:/ proc / 27678#ls -l ./fd
total 0
lr-x ------ 1 root root 64 Mar 26 17:19 0-> pipe:[30690124]
l-wx ---- -1ルートルート64Mar 26 17:19 1->パイプ:[30690125]
lrwx ------ 1ルートルート64Mar 26 17:19 10->ソケット:[30691732]
lr-x ----- 1ルートルート
64Mar 26 17:19 11-> / dev / urandom lrwx ------ 1ルートルート64Mar 26 17:19 12->ソケット:[30719611]
lrwx ------ 1ルートルート64 Mar 26 17:19 13->ソケット:[30719610]
lr-x ------ 1ルートルート64Mar 26 17:19 14->パイプ:[38483750]

mainが子プロセスを作成することをすでに確認できます実行シェルコマンドdockerexec -i mongo_docker_master lsを実行し、同時にパイプを介して子プロセスと通信すると、結果が読み取りパイプにスタックします。
実際、lsofを使用してここを見つけることもできます。プロセス27678によって開かれたFD 14はパイプであり、uは読み取り可能および書き込み可能を表し、rは読み取り可能を表します。

sangfor〜#lsof -d14
コマンドPIDユーザーFDタイプデバイスサイズ/
オフノード名mongod1907 root 14u REG 251,0 36864 130683 /wns/data/mongodb/db/collection-7--588642557116981989.wt
syslog-ng 3446 root 14U UNIX 0xffff88012227d800 0t0 40557736の/ dev /ログ
dockerd 4025ルート14U UNIX 0xffff8800b8d5d800 0t0 13941 /run/docker/libnetwork/a73bd949b5fbb89c2b8bec3b4ac6af0a948a944958c8b037d9e6c9b324b44331.sock
ドッカー-コ9382ルート14U 0000 0,9 0 9553 anon_inode
ドッカー-コ21204ルート14U 0000 0,9 0 9553 anon_inode
パイソン    27678ルート   14R FIFO 0,8 0t0 38483750パイプ

開いたプロセス27678を直接表示することもできます。14がパイプであることがわかります。

sangfor〜#lsof -p27678
コマンドPIDユーザーFDタイプデバイスサイズ/
オフノード名python27678ルート0rFIFO 0,8 0t030690124パイプ
python27678ルート1wFIFO 0,8 0t030690125パイプ
python27678ルート2wFIFO 0,8 0t0 30690126パイプ
python27678 root 3u 0000 0,9 0 9553 anon_inode
python 27678 root 4u 0000 0,9 0 9553 anon_inode
python 27678 root 5u pack 30691718 0t0 unknown type = SOCK_RAW
python 27678 root 6w REG 251,0 76106652 130565 / wns / data / com_host /etc/config/err.log
python 27678 root 7u IPv4 30691716 0t0 TCP Sangfor:53102-> Sangfor:42457(ESTABLISHED)
python 27678 root 8u IPv4 30691717 0t0 TCP Sangfor:42457-> Sangfor:53102(ESTABLISHED)
python 27678 root 9u IPv4 30691731 0t0 TCP db.sd 54072-> sdwan.io:27017(ESTABLISHED)python
27678 root 10u IPv4 30691732 0t0 TCP db.sdwan:54074-> sdwan.io:27017(ESTABLISHED)python
27678 root 11r CHR 1,9 0t0 30690329 / dev / urandom
python 27678ルート12uIPv4 30719611 0t0 TCP db.sdwan:51404-> db.sdwan:37017(ESTABLISHED)
python27678ルート13uIPv4 30719610 0t0 TCP db.sdwan:47124-> db.sdwan:27017(ESTABLISHED)
python27678ルート14rFIFO 0,8 0t0 38483750パイプ
————————————————
元のリンク:https://blog.csdn.net/peng314899581/article/details/79064616

おすすめ

転載: blog.csdn.net/bandaoyu/article/details/114303378