记录一次 core dump 的分析过程

背景

收到运维通知,负责的工程下面有很多core文件,是python进程崩溃后系统生成的。core 文件的生成原理这里不错介绍了,感兴趣的可以自己去了解一下。


core 文件

分析

分析core文件需要上 gdb,因为符号文件的限制,分析时需要有一个和原有问题环境一样的调试环境,否则看到的就是乱码


gdb 显示乱码

因为程序运行在k8s中,需要将镜像文件下载后在容器内调试。

首先是需要把core文件拷贝到容器中,可以按照如下命令进行

docker cp /loca/path/file <container_id>:/container_path

container_id 可以通过 docker ps 查询获得
接下来按如下步骤分析

  1. 启动gdb
gdb /home/chunyu/workspace/ENV/bin/python core.17445
  1. 查看出问题的调用栈

直接 bt 出来的并不对应到python代码,需要启动python的debug信息才行。通过 file python 可以查看当前python debug信息的加载情况。 安装debug信息的方式一般 gdb 也会给出来,我执行的时候命令如下

yum –enablerepo='*debug*' install /usr/lib/debug/.buildid/8d/75b23c27b98a6fc5656327f915409f6f1fba5b.debug

之后就可以通过 py-bt 命令来分析了


py-bt

通过上图可以看出,线程是在执行 hbase 数据读取的时候产生异常出的core文件

  1. 原因分析

初步怀疑是多线程访问导致的问题,从所有线程的调用栈分析上可以看出,thread 1 和 thread 35 两个线程都在进行hbase的访问。thread 35 中直接创建了新链接而thread 1 中还在访问老的链接,直接导致了异常

Thread 1 (Thread 0x7f66b14aa700 (LWP 32386)):
#18 Frame 0x7f66a002ac80, for file /home/workspace/ENV/lib/python2.7/site-packages/thriftpy/thrift.py, line 150, in read (self=<getRowsWithColumns_result(io=None, success=None) at remote 0x7f66b1537890>, iprot=<cybin.TCyBinaryProtocol at remote 0x7f66b1554b40>)
    iprot.read_struct(self)
#22 Frame 0x7f66a005d860, for file /home/workspace/ENV/lib/python2.7/site-packages/thriftpy/thrift.py, line 217, in _recv (self=<TClient(_seqid=0, _service=<type at remote 0x41c81f0>, _iprot=<cybin.TCyBinaryProtocol at remote 0x7f66b1554b40>, _oprot=<cybin.TCyBinaryProtocol at remote 0x7f66b1554b40>) at remote 0x7f66b1544a10>, _api='getRowsWithColumns', fname=u'getRowsWithColumns', mtype=2, rseqid=0, result=<getRowsWithColumns_result(io=None, success=None) at remote 0x7f66b1537890>)
    result.read(self._iprot)
#26 Frame 0x7f669c124950, for file /home/chunyu/workspace/ENV/lib/python2.7/site-packages/thriftpy/thrift.py, line 198, in _req (self=<TClient(_seqid=0, _service=<type at remote 0x41c81f0>, _iprot=<cybin.TCyBinaryProtocol at remote 0x7f66b1554b40>, _oprot=<cybin.TCyBinaryProtocol at remote 0x7f66b1554b40>) at remote 0x7f66b1544a10>, _api='getRowsWithColumns', 
    return self._recv(_api)
#36 Frame 0x7f66a000bd00, for file /home/workspace/ENV/lib/python2.7/site-packages/happybase/table.py, line 162, in rows (self=<Table(connection=<Connection(compat='0.96', _transport_class=<type at remote 0x7f670fdb2d00>, table_prefix=None, table_prefix_separator='_', _protocol_class=<type at remote 0x7f670f57b4c0>, _initialized=True, host='offline_hbase', client=<TClient(_seqid=0, _service=<type at remote 0x41c81f0>, _iprot=<cybin.TCyBinaryProtocol at remote 0x7f66b1554b40>, _oprot=<cybin.TCyBinaryProtocol at remote 0x7f66b1554b40>) at remote 0x7f66b1544a10>, timeout=1000, port=29090, transport=<thriftpy.transport.buffered.cybuffered.TCyBufferedTransport at remote 0x7f66b1554870>) at remote 0x7f66b1544f50>, name='') at remote 0x7f66b1537c10>
    self.name, rows, columns, {})

Thread 35 (Thread 0x7f66b0ca9700 (LWP 32390)):
#14 Frame 0x7f672d8f9790, for file /usr/lib64/python2.7/socket.py, line 224, in meth (name='connect', self=<_socketobject at remote 0x7f66b14c5ad0>, args=(('offline_hbase', 29090),))
    return getattr(self._sock,name)(*args)
#22 Frame 0x7f66b4ad7620, for file /home/workspace/ENV/lib/python2.7/site-packages/thriftpy/transport/socket.py, line 96, in open (self=<TSocket(socket_timeout=<float at remote 0x7f669c0b15e8>, sock=<_socketobject at remote 0x7f66b14c5ad0>, socket_family=2, unix_socket=None, host='offline_hbase', connect_timeout=<float at remote 0x7f669c0b15e8>, port=29090) at remote 0x7f66b14c6e50>, addr=('offline_hbase', 29090))
    self.sock.connect(addr)
#31 Frame 0x7f66b56ceb00, for file /home/workspace/ENV/lib/python2.7/site-packages/happybase/connection.py, line 178, in open (self=<Connection(compat='0.96', _transport_class=<type at remote 0x7f670fdb2d00>, table_prefix=None, table_prefix_separator='_', _protocol_class=<type at remote 0x7f670f57b4c0>, host='offline_hbase', client=<TClient(_seqid=0, _service=<type at remote 0x41c81f0>, _iprot=<cybin.TCyBinaryProtocol at remote 0x7f66b1502dc0>, _oprot=<cybin.TCyBinaryProtocol at remote 0x7f66b1502dc0>) at remote 0x7f66b14c6790>, timeout=1000, port=29090, transport=<thriftpy.transport.buffered.cybuffered.TCyBufferedTransport at remote 0x7f66b15029b0>) at remote 0x7f66b14c6350>)
    self.transport.open()
#34 Frame 0x2e41150, for file /home/workspace/ENV/lib/python2.7/site-packages/happybase/connection.py, line 148, in __init__ (self=<Connection(compat='0.96', _transport_class=<type at remote 0x7f670fdb2d00>, table_prefix=None, table_prefix_separator='_', _protocol_class=<type at remote 0x7f670f57b4c0>, host='offline_hbase', client=<TClient(_seqid=0, _service=<type at remote 0x41c81f0>, _iprot=<cybin.TCyBinaryProtocol at remote 0x7f66b1502dc0>, _oprot=<cybin.TCyBinaryProtocol at remote 0x7f66b1502dc0>) at remote 0x7f66b14c6790>, timeout=1000, port=29090, transport=<thriftpy.transport.buffered.cybuffered.TCyBufferedTransport at remote 0x7f66b15029b0>) at remote 0x7f66b14c6350>, host='offline_hbase', port=29090, timeout=1000, autoconnect=True, table_prefix=None, table_prefix_separator='_', compat='0.96', transport='buffered', protocol='binary')
    self.open()

可以看到 thread35 在重新建立到 hbase 的链接,而 thread1 还在直接的 connection 上读取数据,由于 happybase 的 connection 并不是线程安全的,因此发生了程序崩溃的问题。


重试代码

解决方式为考虑使用 happybase 的连接池。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容