gdb调试定位
一、Core文件简介
gdb一般用于查看进程崩溃产生的core文件,Core文件其实就是内存的映像,当程序崩溃时,存储内存的响应信息,主要用于对程序进行调试。当程序崩溃时会产生core文件,其实准确的应该说是core dump文件,默认生成的位置与可执行程序位于同一目录下,文件名为core.*。
二、开启和关闭core文件的生成
# -c表示生成的core文件的大小,单位字节,unlimited表示不限制大小
ulimit -c unlimited
# 查看core文件是否打开
ulimit -a
三、查看core文件
当程序生成了core文件,就可以通过gdb来打开并定位问题:
# 运行 “gdb 可执行文件 core文件”进入gdb命令行
gdb relation-c2s_worker /home/core/core.81799.1551430888
# 在gdb命令行运行bt就可以定位到导致程序崩溃的原因和行数
(gdb) bt
#0 0x000000320c24812c in vfprintf () from /lib64/libc.so.6
#1 0x000000320c26fa52 in vsnprintf () from /lib64/libc.so.6
#2 0x0000000000444b10 in tbase::tlog::CTLog::log_i (this=0x1c3eb68, flag=<value optimized out>, log_level=3,
fmt=0x7fd4434de930 "[%-10s][%-4d][%-10s] failed to HandleTag, userId:%llu, targetId:%llu, ret:%d\n") at ../comm/tbase/tlog.cpp:472
#3 0x00007fd44323fb06 in c2s::processor::QueryFriendTagProcessor::Execute (this=<value optimized out>, pBaseMsg=0x1edd490)
at /home/wangjun/code/miliao-2.0-relation/relation_c2s/src/processor/relation_processor_tag.cc:234
#4 0x00007fd4433acf67 in milink::syncframework::CWebappFlowMgr::Start (this=0x1c677b0, pMsg=0x1edd490) at src/webapp_flow_mgr.cc:205
#5 0x00007fd4433ad92d in milink::syncframework::CWebappFlowMgr::HandleInput (this=0x1c677b0, iFlowId=10, arg1=0x1c43c40, arg2=<value optimized out>) at src/webapp_flow_mgr.cc:178
#6 0x00007fd44323b515 in spp_handle_process (flow=10, arg1=0x1c43c40, arg2=0x1c3eb60) at /home/wangjun/code/miliao-2.0-relation/plib/webapp_syncframe_v2/include/spp_webapp_frame.h:151
#7 0x0000000000433f55 in spp::worker::CDefaultWorker::ator_recvdata_v2 (flow=10, arg1=0x1c43c40, arg2=0x1c3eb60) at defaultworker.cpp:597
#8 0x00000000004489b5 in tbase::tcommu::tshmcommu::CTShmCommu::poll (this=0x1c43b70, block=false) at ../comm/tbase/tshmcommu.cpp:838
#9 0x0000000000431f93 in spp::worker::CDefaultWorker::realrun (this=0x1c3eb60, argc=2, argv=0x7fff815e5fa8) at defaultworker.cpp:163
#10 0x0000000000431a79 in main (argc=2, argv=0x7fff815e5fa8) at main.cpp:55
从上面的错误可以看出是relation_processor_tag.cc文件的234行打印log的错误。经过排查是打印log时数据类型不匹配。%s对应上了long类型。导致的程序崩溃。
四、gdb常用调试命令
start:用start命令开始执行程序
n:单步执行
b:打断点
c:继续运行程序
display:display b 表示将b的值显示出来
i:info的缩写,可以显示所有的断点
i breakpoints
delete:每个断点都有一个编号,delete 3表示删除编号为3的这个断
Last updated
Was this helpful?