2016-04-13 3 views
1

私は1つのドッカーコンテナにgunicornのコアダンプを作成し、別のものでそれをデバッグしようとしています。 Gunicornはpython3.5で動作しています。 私はそれがダンプされた容器の中にコアファイルを開いていた場合、すべてが正常に見える:ガンコンコアダンプ使用時のGDB空のバックトレース

Reading symbols from /opt/pyenv/versions/3.5.0/bin/python3.5...done. 
[New LWP 786] 
[Thread debugging using libthread_db enabled] 
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". 
Core was generated by `/opt/pyenv/versions/3.5.0/bin/python3.5'. 
#0 0x00007f7caec93af3 in __epoll_wait_nocancel() at ../sysdeps/unix/syscall-template.S:81 
81  ../sysdeps/unix/syscall-template.S: No such file or directory. 
(gdb) bt 
#0 0x00007f7caec93af3 in __epoll_wait_nocancel() at ../sysdeps/unix/syscall-template.S:81 
#1 0x00007f7cacdaf213 in pyepoll_poll (self=0x7f7ca5aa9a80, args=<optimized out>, kwds=<optimized out>) at /tmp/python-build.20160412233915.330/Python-3.5.0/Modules/selectmodule.c:1549 
#2 0x00000000005a7579 in PyCFunction_Call ([email protected]=0x7f7c98706090, [email protected]=0x7f7c9feb5550, [email protected]=0x0) at Objects/methodobject.c:98 
... 

しかし、私は、私は目的をデバッグするために構築されてきた別の容器にこのファイルを開くしようとしているとき、私は」これを持っています:

Reading symbols from /opt/pyenv/versions/3.5.0/bin/python3.5...done. 

warning: exec file is newer than core file. 
[New LWP 356] 

warning: Unexpected size of section `.reg-xstate/356' in core file. 
Core was generated by `/opt/pyenv/versions/3.5.0/bin/python3.5'. 

warning: Unexpected size of section `.reg-xstate/356' in core file. 
#0 0x00007fb1e8695af3 in ??() 
(gdb) bt 
#0 0x00007fb1e8695af3 in ??() 
#1 0x00007fb1e67b1213 in ??() 
#2 0x000000000225b588 in ??() 
#3 0x0034e2b269edb810 in ??() 
#4 0x00000000000003ff in ??() 
#5 0x0000000400000001 in ??() 

なぜ私は空のバックトレースを取得しているのか分かりません。多分誰かがこれで私を助けることができますか? ありがとう!私は目的をデバッグするために構築されてきた別の容器内

+1

"警告:execファイルはコアファイルより新しいです。"既にあなたを疑わしいものにするはずです。 – Olaf

+0

いいえ、これは、コアダンプがPythonより前にビルドされたためです。 – Kron

+1

正確に。それが何を意味するのか考えてみてください。 – Olaf

答えて

0

、私はこれを持っている:

それはあなたが「私はデバッグのために構築してきました」により何を意味するかは明らかではありません。一般的に

、あなたはコアがをダンプ解析するために使用したバイナリはまさにこのコアダンプを生成されたバイナリと一致する必要があります。あなたがこれを行うことができないことを意味

gcc -O2 -o foo t.c 
./foo # crashes, produces core dump 

gcc -g -o foo-g t.c # note lack of -O2 
gdb ./foo-g core  # will not work! 

代わりに、何をやるべきことはこれです:

gcc -g -O2 -o foo-g t.c # optimize with debug info 
cp foo-g foo 
strip -g foo # make a production binary by removing debug info 

./foo    # crashes, produces a core dump 
gdb ./foo-g core # this works! 

2つのバイナリがすることができます、十分に「同じ」かどうかをテストするにはそれらのシンボルを比較する。

diff <(readelf -Ws foo-g) <(readelf -Ws foo) 

バイナリデバッグは(例えばLOCAL関数など)剥離バイナリに存在しないシンボルを有することができるが、両方のバイナリに存在するシンボルが同じ値を持たなければなりません。

"デバッグ用にビルドされた" python3.5は、 "プロダクション" python3.5と同じではないと思います。

+0

私は別のコンテナで同じ方法でPythonをビルドしていましたが、実際は異なっています。ご協力いただきありがとうございます! – Kron

+0

私はついに、Pythonのバイナリが異なる理由を見つけました。元のコンテナはubuntuにあったが、私のデバッグコンテナはdebian上にあったので、Pythonは異なる環境でコンパイルされていた。 – Kron

関連する問題