coredump分析
来源:互联网 发布:淘宝网雪纺上衣 编辑:程序博客网 时间:2024/06/06 01:37
关于coredump的产生及原因本文就不做分析,主要介绍一下对一个coredump文件怎么分析。
到这里还可以打印此时的各个变量信息,用法为
其中file和function分别是文件名及文件的全局变量。函数名及函数里面的变量。
设置某个文件里面你的断点
首先通过命令
gdb freeswitch core.60954
进入gdb。
这里freeswitch 是产生coredump的可执行应用,core.60954是应用产生的coredump文件。
然后执行命令
bt
可以看到运行出错的堆栈信息
(gdb) bt#0 0x00007fd372e3344d in lua_remove () from /lib64/liblua-5.1.so#1 0x00007fd3730635ef in docall (L=0x7fd39802dcc0, narg=<optimized out>, nresults=1, perror=1, fatal=0) at mod_lua.cpp:94#2 0x00007fd373065d94 in LUA::Session::run_dtmf_callback (this=0x7fd3980569d0, input=0x7fd39001f9f0, itype=<optimized out>) at freeswitch_lua.cpp:332#3 0x00007fd3be601241 in audio_bridge_thread (obj=obj@entry=0x7fd398181d20, thread=0x0) at src/switch_ivr_bridge.c:599#4 0x00007fd3be6023c2 in audio_bridge_on_exchange_media (session=0x7fd398077058) at src/switch_ivr_bridge.c:856#5 0x00007fd3be5925ca in switch_core_session_run (session=0x7fd398077058) at src/switch_core_state_machine.c:653#6 0x00007fd3be58be5e in switch_core_session_thread (thread=<optimized out>, obj=0x7fd398077058) at src/switch_core_session.c:1648#7 0x00007fd3be587b53 in switch_core_session_thread_pool_worker (thread=0x7fd398096310, obj=<optimized out>) at src/switch_core_session.c:1711#8 0x00007fd3be842210 in dummy_worker (opaque=0x7fd398096310) at threadproc/unix/thread.c:151#9 0x00007fd3bc653dc5 in start_thread () from /lib64/libpthread.so.0#10 0x00007fd3bbd2bd0d in clone () from /lib64/libc.so.6
到这里还可以打印此时的各个变量信息,用法为
p file::variable p function::variable
其中file和function分别是文件名及文件的全局变量。函数名及函数里面的变量。
比如打印下面函数:
static void *audio_bridge_thread(switch_thread_t *thread, void *obj){switch_ivr_bridge_data_t *data = obj;int stream_id = 0, pre_b = 0, ans_a = 0, ans_b = 0, originator = 0;switch_input_callback_function_t input_callback;switch_core_session_message_t msg = { 0 };void *user_data;switch_channel_t *chan_a, *chan_b;switch_frame_t *read_frame;switch_core_session_t *session_a, *session_b;
session_a的值:
p *audio_bridge_thread::session_a*号表示指针的值,如果是普通结构体可以去掉。
为了输出结果更好看点,可以执行
set print pretty on然后执行结果如下:
(gdb) p *audio_bridge_thread::session_a$5 = { pool = 0x7fd398075048, thread = 0x7fd398096310, thread_id = 140546079377152, endpoint_interface = 0xac6860, id = 64, flags = (SSF_WARN_TRANSCODE | SSF_THREAD_STARTED | SSF_THREAD_RUNNING | SSF_READ_TRANSCODE), channel = 0x7fd398075130, event_hooks = { outgoing_channel = 0x0, receive_message = 0x0, receive_event = 0x0, read_frame = 0x0, video_read_frame = 0x0, write_frame = 0x0, video_write_frame = 0x0, kill_channel = 0x0, send_dtmf = 0x0, recv_dtmf = 0x7fd398181778, state_change = 0x0, state_run = 0x0 }, read_codec = 0x7fd398088778, real_read_codec = 0x7fd398088778, write_codec = 0x7fd3980887d8, real_write_codec = 0x0, video_read_codec = 0x7fd39808d918, video_write_codec = 0x7fd39808d978, ........
附着到一个pid为39657对应的进程
gdb attach 39657
设置某个文件里面你的断点
break filename:linenumbreak filename:func例如: break switch_ivr_async.c:4530
常用gdb命令
gcc -g main.c //在目标文件加入源代码的信息gdb a.out (gdb) start //开始调试(gdb) n //一条一条执行(gdb) step/s //执行下一条,如果函数进入函数(gdb) backtrace/bt //查看函数调用栈帧(gdb) info/i locals //查看当前栈帧局部变量(gdb) frame/f //选择栈帧,再查看局部变量(gdb) print/p //打印变量的值(gdb) finish //运行到当前函数返回(gdb) set var sum=0 //修改变量值(gdb) list/l 行号或函数名 //列出源码(gdb) display/undisplay sum //每次停下显示变量的值/取消跟踪(gdb) break/b 行号或函数名 //设置断点(gdb) continue/c //连续运行(gdb) info/i breakpoints //查看已经设置的断点(gdb) delete breakpoints 2 //删除某个断点(gdb) disable/enable breakpoints 3 //禁用/启用某个断点(gdb) break 9 if sum != 0 //满足条件才激活断点(gdb) run/r //重新从程序开头连续执行(gdb) watch input[4] //设置观察点(gdb) info/i watchpoints //查看设置的观察点(gdb) x/7b input //打印存储器内容,b--每个字节一组,7--7组(gdb) disassemble //反汇编当前函数或指定函数(gdb) si // 一条指令一条指令调试 而 s 是一行一行代码(gdb) info registers // 显示所有寄存器的当前值(gdb) x/20 $esp //查看内存中开始的20个数
阅读全文
0 0
- coredump分析
- coredump 分析
- coredump分析
- 程序故障分析coredump
- coredump 分析(汇总)
- coredump故障分析
- source insight coredump分析
- GDB---coredump分析
- Coredump故障分析
- 如何分析CoreDump文件
- coredump的原因以 如何分析coredump文件
- coredump
- Coredump
- coredump
- coredump
- coredump
- coredump
- coredump
- OpenCV,OpenGL,DirectX
- Python数据分析matplotlib设置多个子图的间距
- java初学者,应该怎么去学习?
- SettingWithCopyWarning 解决方案
- 《Java编程技巧1001条》第376条 , 了解数组,
- coredump分析
- 【Python-ML】感知器学习算法(perceptron)
- 每天一个linux命令(28):tar命令
- android线程做服务端接受数据传给UI线程
- 不允许输入空格
- vue2.0在使用websocket时切换页面后websocket依旧保持连接
- 多个DataTable按某一列合并
- 微信小程序与内嵌网页交互实现支付功能
- 说一说IT行业与风投