python - 使用 gunicorn 核心转储时 GDB 为空回溯

标签 python c docker gdb gunicorn

我正在尝试在一个 docker 容器中制作 gunicorn 的核心转储,然后在另一个容器中进行调试。 Gunicorn 使用 python3.5 运行。 当我在转储它的容器中打开核心文件时,一切看起来都很好:

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 (func=func@entry=0x7f7c98706090, args=args@entry=0x7f7c9feb5550, kwds=kwds@entry=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 ?? ()

我不明白为什么我得到的回溯是空的。也许有人可以帮我解决这个问题? 谢谢!

最佳答案

in the another container I have built for debugging purpose, I've got this:

不清楚您所说的“我为调试而构建”是什么意思。

一般来说,您用来分析核心转储的二进制文件必须与生成此核心转储的二进制文件完全匹配。

这意味着你不能这样做:

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!

要测试两个二进制文件是否足够“相同”,您可以比较它们的符号,例如

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

调试二进制文件可以具有剥离二进制文件中不存在的符号(例如LOCAL 函数),但是两个二进制文件中存在的符号必须具有相同的值。

我猜测您的“为调试而构建”python3.5 与您的“生产”python3.5 不同。

关于python - 使用 gunicorn 核心转储时 GDB 为空回溯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36610765/

相关文章:

postgresql - 将 Airflow 连接添加到本地主机数据库(在 docker 上运行的 postgres)

file - 无法使用 std::fs 方法读取 Docker 镜像中的文件

python - celery - 没有名为五的模块

Python mongoengine - 保存后检索_id

Python:使用 *args 作为字典键

python - docker-compose 与来自 sql 转储的多个 postgres 数据库

python - 如何在 tkinter 中更改形状(即椭圆形)的坐标?

c - 调用函数是否比 SendMessage() 更快?

c - OpenCL - 双重原子操作 - 工作到极限

c - 防止链表中的 char * 改变