麒麟系统开发笔记:在国产麒麟系统上使用gdb定位崩溃异常方法流程进阶定位代码行数及专项测试Demo

Posted 长沙红胖子Qt

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了麒麟系统开发笔记:在国产麒麟系统上使用gdb定位崩溃异常方法流程进阶定位代码行数及专项测试Demo相关的知识,希望对你有一定的参考价值。

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/129871385

红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…

国产麒麟系统相关开发

上一篇:《麒麟系统开发笔记(十):在国产麒麟系统上使用gdb定位崩溃异常方法流程以及测试Demo
下一篇:敬请期待…


前言

  上一篇,通过研究,可以定位到函数,本篇进一步优化,没有行数,程序较为复杂的时候,就无法定位,所以进一步定位。
  本篇做了qBreakpad的研究,但是没有成功,过程也还是填出来,后来突然注意到gdb出现行数的方法,并通过了几轮测试以及实战,确实可以定位到行数,所以为了大家方便,把国企麒麟上的Qt崩溃方法分享出来。
  本篇文章比较长,就不分篇了,同时还做了专项测试。


注意

  阅读者如果一开始有点懵,可能先要看先大致扫一下:《麒麟系统开发笔记(十):在国产麒麟系统上使用gdb定位崩溃异常方法流程以及测试Demo》,本篇也是解决上一篇探讨的遗留问题(只定位了函数,未定位代码行号)。


使用gdb定位Qt的release(国产麒麟系统)

步骤一:修改上一篇demo的pro配置

  (这里是上一篇的demo,只关注红框的即可)
  

步骤二:重新编译调试还是没有行号

  

  

  

  与没有-g的时候没有啥区别。

步骤三:多加几层调用追加堆栈测试

  修改下代码:
  

  

  测试:
  

  还是没有堆栈信息:
  

步骤四:怀疑是release版本,改为debug测试

  改为debug版本,也没有:
  

  不清楚原因,这里博主就没有深究了

步骤五:路回峰转,重启gdb,成功定位

  研究qBreakpad去了,但是qBreakpad也入深坑了,在爬坑的时候,突然注意到gdb的bt指令,所以研究了个把小时qBreakpad又折回来继续了。
  
  至此,出现了行号:
  


配置调试发布专项测试

  为了确认最简单的方式,所以进行测试:

DEFINES += QT_NO_DEBUG_OUTPUT
DEFINES += QT_NO_WARN_OUTPUT
QMAKE_CXXFLAGS += -g 
#QMAKE_CXXFLAGS += -g3

测试:debug版本,无-g,不屏蔽qt打印输出

  

测试:debug版本,有-g的,不屏蔽qt打印输出

  

  有行号,行号跟函数在同一行。

测试:debug版本,有-g的,屏蔽qt打印输出

  

  有行号,行号跟函数在同一行。

测试:release版本,有-g/-g3,有qt屏蔽打印输出

#DEFINES += QT_NO_DEBUG_OUTPUT
#DEFINES += QT_NO_WARN_OUTPUT
QMAKE_CXXFLAGS += -g 
#QMAKE_CXXFLAGS += -g3

  

  

  

  还试了下-g3:
  

  定位了函数,不定位行号。

测试:release版本,有-g/-g3,未屏蔽qt打印输出

  

  所以,最终发现是不能屏蔽qt打印输出的,不然是没有的,跟release或者debug没有关系(没有去论证debug下屏蔽qt打印输出了)

测试:release版本,无-g,未屏蔽qt打印输出

  

  所以,无-g也不行

模拟实战

  先加了一句代码:
  

  取消屏蔽qt打印,加上-g:
  

  使用release编译后,运行崩溃:
  

  定位coredump文件:
  

  然后使用gdb的方法:
  
  这里得行是qlist.h的行号,不是我们代码的行号,所以下标错误估计就这样了。可以判断出,越界也是最后某个地方调用指针导致错误,所以越界当时是不会有问题,当越界在用越界调用的就把出错的指针调用出行数打出来。
  下面试试指针错误:
  


专项测试结论

  


入坑

入坑一:gdb不出现行数

问题

  Gdb调试不出现行数

原因

  • 原因1:release与debug问题
  • 原因2:-g问题
  • 原因3:是否屏蔽qt打印问题
      1+2+3,导致情况多种,花了不少时间定位

解决

  进行了专项测试论证,查看“专项测试论证”。


qBreakpad(此方法未通,贴出来参考,有兴趣的读者可以继续往下走)

  qBreakpad下载地址:https://github.com/buzzySmile/qBreakpad

git clone --recursive https://github.com/buzzySmile/qBreakpad.git

  好像下下来有点问题,最后还是手动下载zip包了:
  

  qBreakpad依赖breakpad和lss
  

  下不下来,另外找把

  breakpad下载地址:https://github.com/google/breakpad

  (最新版报错),下载v2021.08.09版本

  

  lss:https://github.com/ithaibo/linux-syscall-support
  下载来:


编译qBreakpad库

步骤一:下载解压

  

步骤二:复制改名依赖库

  复制过去并改名:
  

  改完后(先删除已经存在的):
  

步骤三:使用qtcreator打开qBreakpad编译

  

步骤四:解决错误“undefined reference to `google_breakpad::PEFile::TryGetDebugInfo(xxxx”,继续编译

  怀疑是版本问题,降低版本试试:
  

  如下,下载解压后替换:
  

步骤五:解决错误“*** No rule to make target ‘xxx/minidump_file_writer.cc’, needed by ‘_build/obj/minidump_file_writer.o’. Stop.”

  “*** No rule to make target ‘…/…/qBreakpad-master/third_party/breakpad/src/client/minidump_file_writer.cc’, needed by ‘_build/obj/minidump_file_writer.o’. Stop.”
  
  那岂不是要降低qBreakpad的版本?试一试
  至此,突然发现gdb的bt,所以这边停止了。


上一篇:《麒麟系统开发笔记(十):在国产麒麟系统上使用gdb定位崩溃异常方法流程以及测试Demo
下一篇:敬请期待…


若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/129871385

麒麟系统开发笔记:在国产麒麟系统上搭建宇视摄像头SDK基础环境Demo

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/127532255

红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)

国产麒麟系统相关开发

上一篇:《麒麟系统开发笔记(八):在国产麒麟系统上使用linuxdeployqt发布qt程序
下一篇:敬请期待…


前言

  国产麒麟系统开发上,使用宇视摄像头,本篇使用宇视官网的提供的SDK,搭建基础的国产系统上宇视摄像头SDK开发化境Demo。


效果演示

  

相关博客

  《项目实战:Qt球机控制工具 v1.0.0(球机运动八个方向以及运动速度,设置运动到指定角度,查询当前水平和垂直角度)
  《麒麟系统开发笔记(九):在国产麒麟系统上搭建宇视摄像头SDK基础环境Demo


宇视SDK下载

  CSDN粉丝0积分下载地址:https://download.csdn.net/download/qq21497936/86806967
  QQ群下载:请回首页加QQ群,QQ群文件搜索"NETDEVSDK"
  官方下载地址:https://cn.uniview.com/
  
  


模块化部署

  


引入sdk

  在cameraManager.pri引入(非模块化可以直接在pro中添加):

# 引入摄像头头文件和sdk
DEFINES += LINUX
INCLUDEPATH += $$PWD/NETDEVSDK_Linux64_V2.6.0.0/include
LIBS += -L$$PWD/NETDEVSDK_Linux64_V2.6.0.0/lib
LIBS += -lNetDEVSDK

  其中LINUX宏是NetDEVSDK.h头文件中需要枚举的,其他为标准引入方法:头文件,库路径,库文件。
  运行报错:
  

  这里是因为libNetDEVSDk.so引用了很多其他的库,而这些库sdk的lib中也有,但是需要我们手动引入以下:
  

  按照错误提示,将需要的库引入:
  

# 引入摄像头头文件和sdk
DEFINES += LINUX
INCLUDEPATH += $$PWD/NETDEVSDK_Linux64_V2.6.0.0/include
LIBS += -L$$PWD/NETDEVSDK_Linux64_V2.6.0.0/lib
LIBS += -lNetDEVSDK

LIBS += -lmxml
LIBS += -lNetDiscovery
LIBS += -lcloud
LIBS += -lpolarssl
LIBS += -lcloudclient
LIBS += -lcloudhttpcurl
LIBS += -levent
LIBS += -lstun
LIBS += -lt2u
LIBS += -lCloudSDK
LIBS += -lNDPlayer
LIBS += -lNDRM

  编译报错,继续引入:
  

  成功编译,然后运行:
  

  使用qtcreator运行也需要引入,那么在工程中添加LD_LIBRARY_PATH路径,引入到模块下的lib中,本来还想在Qtcreator运行环境中引入,但是实际上已经有了:
  
  这就奇怪了,已有了运行起来还加载不到,不纠结,使用ldconfig将其添加进系统连接路径:

sudo vi /etc/ld.so.conf
sudo ldconfig

  
  成功运行起来:
  
  使用此种方式,库也无需引入这么多了:
  最终cameraManager.pri如下:

INCLUDEPATH += $$PWD
DEPENDPATH += $$PWD

HEADERS += \\
    $$PWD/CameraManager.h

SOURCES += \\
    $$PWD/CameraManager.cpp

# 引入摄像头头文件和sdk
DEFINES += LINUX
INCLUDEPATH += $$PWD/NETDEVSDK_Linux64_V2.6.0.0/include
LIBS += -L$$PWD/NETDEVSDK_Linux64_V2.6.0.0/lib
LIBS += -lNetDEVSDK

# 新系统后,将sdk的lib目录添加进/etc/ld-so.conf
# 绝对路径另起一行,无include
# 使用ldconfig即可

工程模板

  


红胖子建议

  引入库的方法很多,根据项目情况和自身习惯选择合适自己的即可,但是有一点特别注意,就是项目迁移或者交接源代码的时候,一定要描述清楚,避免交接源码后接收代码着环境搭建都需要细节沟通甚至花费几天,尤其跨项目组部门公司这种,所以,笔者更倾向于直接将库包含进模块,这样笔者交接代码都属于傻瓜式交接,项目交接后都可直接编译修改的,基本不存在任何环境问题。(纯技术角度)


ldconfig引入库方法总结

步骤一:lib绝对文件夹路径获取

  

步骤二:修改/etc/ld-so.conf,将lib库路径另起一行,填入库文件夹绝对路径一行

  

  

步骤三:使用ldconfig

  


上一篇:《麒麟系统开发笔记(八):在国产麒麟系统上使用linuxdeployqt发布qt程序
下一篇:敬请期待…


若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/127532255

以上是关于麒麟系统开发笔记:在国产麒麟系统上使用gdb定位崩溃异常方法流程进阶定位代码行数及专项测试Demo的主要内容,如果未能解决你的问题,请参考以下文章

麒麟系统开发笔记:在国产麒麟系统上使用linuxdeployqt发布qt程序

麒麟系统开发笔记:在国产麒麟系统上使用linuxdeployqt发布qt程序

麒麟系统开发笔记:在国产麒麟系统上搭建宇视摄像头SDK基础环境Demo

麒麟系统开发笔记:在国产麒麟系统上搭建宇视摄像头SDK基础环境Demo

麒麟系统开发笔记:国产麒麟系统搭建开发环境之虚拟机安装

麒麟系统开发笔记:国产麒麟系统搭建开发环境之虚拟机安装