本文主要是介绍【Qnx】Qnx coredump解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Qnx coredump解析
coredump文件
Qnx运行的程序崩溃时,会生成coredump文件。
默认情况下这些文件默认会保存在/var/log/*.core
文件中。
解析coredump文件,可以帮忙加快分析程序崩溃的原因,比如了解崩溃的堆栈。
通常可以使用gdb
和coreinfo
,帮助分析coredump文件。
coreinfo
coreinfo是QNX提供的一个bin文件,这个bin用来显示CoreDump文件的信息
coreinfo [-ilmstv] file [file ...]
选项:
-i 显示进程信息
-l 显示QNT_LINK_MAP相关信息
-m 显示内存Map(Memeroy Map)
-t 显示线程信息
-v 追加debug信息输出
如果不指定这些选项,默认输出所有信息。
coreinfo官网链接:
https://www.qnx.com/developers/docs/7.1/index.html#com.qnx.doc.neutrino.utilities/topic/c/coreinfo.html
coreinfo默认集成在Qnx的Image中,在Qnx系统终端执行即可。例如
coreinfo /var/log/test.core
输出信息类似如下内容:
包括cpu核信息、MACHINE、HOSTNAME、崩溃进程中线程状态等。这些信息,对了解程序崩溃的状态有些帮忙,但是对具体的问题解析,还是需要利用gdb工具。
processor=ARM AArch64 num_cpus=8cpu 1 cpu=1091556528 name=*** *** Gold speed=***flags=0xc0000c7a FPU MMU V6 V7 V7_MP NEON IDIV VFP_D32cpu 2 cpu=1091556528 name=*** *** Gold speed=***flags=0xc0000c7a FPU MMU V6 V7 V7_MP NEON IDIV VFP_D32cpu 3 cpu=1091556528 name=*** *** Gold speed=***flags=0xc0000c7a FPU MMU V6 V7 V7_MP NEON IDIV VFP_D32cpu 4 cpu=1091556528 name=*** *** Gold speed=***flags=0xc0000c7a FPU MMU V6 V7 V7_MP NEON IDIV VFP_D32cpu 5 cpu=1091556544 name=*** *** Gold Plus speed=***flags=0xc0000c7a FPU MMU V6 V7 V7_MP NEON IDIV VFP_D32cpu 6 cpu=1091556544 name=*** *** Gold Plus speed=***flags=0xc0000c7a FPU MMU V6 V7 V7_MP NEON IDIV VFP_D32cpu 7 cpu=1091556544 name=*** *** Gold Plus speed=***flags=0xc0000c7a FPU MMU V6 V7 V7_MP NEON IDIV VFP_D32cpu 8 cpu=1091556544 name=*** *** Gold Plus speed=***flags=0xc0000c7a FPU MMU V6 V7 V7_MP NEON IDIV VFP_D32cyc/sec=*** tod_adj=*** nsec=*** inc=***boot=0 epoch=1970 intr=27rate=*** scale=-16 load=1920MACHINE="******" HOSTNAME="localhost"pid=2076765 parent=1138777 child=0 pgrp=*** sid=***flags=0x49002000 umask=02 base_addr=0x397fca7000 init_stack=0x10c1000870ruid=0 euid=0 suid=0 rgid=0 egid=0 sgid=0ign=0000000000000000 queue=ff00000000000000 pending=0000000000000000fds=4 threads=2 timers=0 chans=1canstub=0 sigstub=0couldn't read stack: No such process
argc: 6 argv: thread 1ip=0x4cec9ce290 sp=0x10c1000690 stkbase=0x10c0f80000 stksize=528384state=JOIN flags=0 last_cpu=1 timeout=00000000pri=10 realpri=10 policy=RRtls=0x10c1000dc0thread 2 SIGNALLED-SIGABRT code=0 from pid=2076765 uid=-1 value=0(0x0)ip=0x4cec9ce2a0 sp=0x10c1042760 stkbase=0x10c1002000 stksize=266240state=STOPPED flags=4000000 last_cpu=1 timeout=00000000pri=10 realpri=10 policy=RRtls=0x10c10429d0
Gdb
gdb是常用的debug工具,关于gdb的概念可自行百度理解。这里说一下Qnx上如何使用gdb。
一般来说Qnx源码中,会提供针对架构的gdb工具。这些个工具可以在Host上运行。
ARMv7 | ntoarmv7-gdb |
AArch64 | ntoaarch64-gdb |
x86 64-bit | ntox86_64-gdb |
Qnx官网说明链接:https://www.qnx.com/developers/docs/7.1/index.html#com.qnx.doc.neutrino.utilities/topic/g/gdb.html
例如:
qnx程序跑在AArch64架构下,崩溃产生了coredump文件,test.core
使用gdb的解析步骤:
- 首先把test.core 从qnx系统中,导入到Host上(比如Ubutun上)
- 在host的QNX的源码中,找到ntoaarch64-gdb(路径可能在 qnx源码/**/host/linux/x86_64/usr/bin 中)
- 在Host上,设置好Qnx编译环境(一般在编译qnx源码时,都会有一个sh脚本设置)
- 使用gdb 加载崩溃的bin(Host上编译出来的bin) 以及 test.core
# 例子,路径根据实际情况修改
**/**/host/linux/x86_64/usr/bin/ntoaarch64-gdb install/aarch64le/usr/bin/test install/test.core
- 如果gdb找不到bin程序需要的so等,可以通过 set solib-search-path (GDB的交互命令,网上使用方式比较多)设置so的查找路径
- 在gdb中运行bt即可,输出崩溃堆栈(前提:so等库时带符号的,可以在编译时加入导出debug符合的参数选项)
下面是test.core的一段输出示意(因为某些原因,部分内容用了**代替,所以只是示例)
#0 Test::start (this=0x33f06840a8) at /*****/test.cpp:100:115
#1 0x00000049e17ed874 in Test::Test111 (this=0x25a6f25990) at /*****/test.cpp:100
#2 0x00000049e17f06b4 in ****at /*****/qnx7/usr/include/c++/v1/type_traits:4294
#3 std::__1::__thread_execute<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void (Test::*)(), Test*, 2ul> (__t=...)at /*****/target/qnx7/usr/include/c++/v1/thread:342
#4 std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void (Test::*)(), Test*> > (__vp=0x33f0685090) at /*****/qnx7/usr/include/c++/v1/thread:352
#5 0x00000049e1970fa8 in pthread_attr_setdetachstate (attr=0x105e0002, detachstate=1869902687) at /***/build_aarch64/lib/c/1c/pthread_attr_setdetachstate.c:30
实际上,就是把coredump从Qnx系统中copy出来,然后放到本地有Qnx开发环境,以及相关二进制+库的PC上。然后使用gdb加载即可。
这篇关于【Qnx】Qnx coredump解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!