当前位置: 首页 > news >正文

php网站开发优化东莞百度seo推广公司

php网站开发优化,东莞百度seo推广公司,wordpress官网视频教程,国内最好的crm视频文章目录 1.背景2.Qt编译生成程序2.1.profile模式的本质 3.执行程序,得到core文件4.代码定位4.1.直接使用gdb4.2.使用QtCreator 5.总结6.题外话6.1.profile模式和debug模式的区别 1.背景 在使用Qt时,假如在windows,当软件崩溃时,…

文章目录

  • 1.背景
  • 2.Qt编译生成程序
    • 2.1.profile模式的本质
  • 3.执行程序,得到core文件
  • 4.代码定位
    • 4.1.直接使用gdb
    • 4.2.使用QtCreator
  • 5.总结
  • 6.题外话
    • 6.1.profile模式和debug模式的区别

1.背景

在使用Qt时,假如在windows,当软件崩溃时,可以利用生成dmp文件来查找软件崩溃的原因及原因出现的位置(在源码的哪一行)。具体可以看看我这篇博客:【Qt下生成pdb文件,并在exe崩溃时生成dmp文件,且由dmp查询崩溃原因】;
但是在linux下,要生成dmp文件貌似很麻烦,要用到google的BreakPad【Qt Linux系统使用QBreakpad实战】。
有没有方便一点的方法呢?
其实有的,linux下原生支持一种定位软件崩溃的方式:core dump。

2.Qt编译生成程序

建立一个简单的程序,并写一段空指针导致崩溃的程序
在这里插入图片描述选择profile模式进行编译:
在这里插入图片描述

2.1.profile模式的本质

选择profile模式进行编译时,除了生成一个以项目名字命名的可执行程序外,还会生成一个以项目名字+.debug命名的文件。
这个文件不是可执行文件,而是一个调试信息文件,里面的信息会辅助程序在崩溃时保存当时的堆栈、变量值等。
在这里插入图片描述
关于这个*.debug文件的生成,我们还可以从Qt的编译输出窗口了解到一些信息:
在这里插入图片描述首先,g++在编译时是加了-g选项,表示在编译时把调试信息编译进去(相当于debug模式?)
然后再看这一行:

objcopy --only-keep-debug untitled1 untitled1.debug && objcopy --strip-debug untitled1 && objcopy --add-gnu-debuglink=untitled1.debug untitled1 && chmod -x untitled1.debug

这里用到一个关键命令:objcopy,关于这个工具的用法,可以查看【GNU objcopy命令的探索:(转换二进制文件)】

可以看到上面这个语句分为四部分,依次执行:

  • objcopy --only-keep-debug untitled1 untitled1.debug
    使用objcopy工具来创建一个调试信息副本。–only-keep-debug选项告诉objcopy只保留调试信息而不进行其他任何操作。untitled1是原始的目标文件,而untitled1.debug是生成的只包含调试信息的文件。
  • objcopy --strip-debug untitled1
    这一行再次使用objcopy,但这次是去除目标文件untitled1中的调试信息。–strip-debug选项会移除所有的调试信息,使得目标文件更小,运行速度可能更快,但这样会使得调试变得更加困难。
  • objcopy --add-gnu-debuglink=untitled1.debug untitled1
    这一行又用objcopy来重新添加一个GNU风格的调试链接到untitled1可执行文件中。–add-gnu-debuglink=后面跟着的untitled1.debug是之前保留的调试信息文件。这样,即使调试信息被剥离,执行文件中仍然有一个指向原始调试信息的链接,可以在调试时恢复调试信息。
  • chmod -x untitled1.debug
    最后一行使用chmod命令改变untitled1.debug文件的权限,使得这个文件不可执行。-x选项表示移除执行权限。
    总的来说,这四段命令的目的是对原可执行文件优化(去除调试信息)后,仍然能够恢复和执行原始的调试信息,以便于后续的调试工作。

3.执行程序,得到core文件

将编译出来的两个文件拷贝到一个单独的文件夹(目的是避嫌,测试在空白环境能不能运行)
在这里插入图片描述然后在此文件夹打开控制台(或者打开控制台后cd到这个文件夹)
执行两个语句(这两个语句的作用可以查看这里【Linux生成core文件相关配置,core文件调试示例】)

ulimit -c 4096
sudo sysctl kernel.core_pattern=%e.core

在这里插入图片描述

然后执行程序

./untitled1

在这里插入图片描述可以看到,生成了core文件(不知道为啥.code后面还加了个数字)

4.代码定位

在得到core文件后,假如想要知道到底是哪一行代码导致了程序崩溃,有两种方式:

4.1.直接使用gdb

gdb untitled1 untitled1.core.9305

在这里插入图片描述可以看到,崩溃的地方被显示出来了。
还可以把这个ptr运行时的值打印出来

print ptr

在这里插入图片描述

4.2.使用QtCreator

选择Debug–》Start Debugging–》Load Core File
在这里插入图片描述在弹窗中选择刚才的core文件,选好后,可执行文件会自动填充。然后点击ok。
在这里插入图片描述
然后就可以调试了:

在这里插入图片描述同样定位到了正确的代码处,并且还把当时的各个变量的值直接显示出来。
所以这种方式应该是比较适合咱们这种一般人。

5.总结

Linux下程序的崩溃文件生成相对于Windows下还方便一点(Windows下还得自己保存dmp文件),可能各有千秋吧。
暂时还没试过在A电脑编译程序,然后放到B电脑运行产生core文件,然后再拿回A电脑进行代码定位。有空的话得测试一下。

6.题外话

6.1.profile模式和debug模式的区别

我们直接把这两种的编译语句拿出来对比一下

这是debug的:    g++ -c -pipe -g -std=gnu++1z -Wall -Wextra -D_REENTRANT -fPIC -DQT_QML_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I../untitled1 -I. -I/opt/Qt/5.15.2/gcc_64/include -I/opt/Qt/5.15.2/gcc_64/include/QtWidgets -I/opt/Qt/5.15.2/gcc_64/include/QtGui -I/opt/Qt/5.15.2/gcc_64/include/QtCore -I. -I/usr/include/libdrm -I. -I/opt/Qt/5.15.2/gcc_64/mkspecs/linux-g++ -o main.o ../untitled1/main.cpp
这shiprofile的: g++ -c -pipe -O2 -g -std=gnu++1z -Wall -Wextra -D_REENTRANT -fPIC -DQT_QML_DEBUG -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I../untitled1 -I. -I/opt/Qt/5.15.2/gcc_64/include -I/opt/Qt/5.15.2/gcc_64/include/QtWidgets -I/opt/Qt/5.15.2/gcc_64/include/QtGui -I/opt/Qt/5.15.2/gcc_64/include/QtCore -I. -I/usr/include/libdrm -I. -I/opt/Qt/5.15.2/gcc_64/mkspecs/linux-g++ -o main.o ../untitled1/main.cpp

对比一下可以看到,主要是在profile下,多了 -O2 -DQT_NO_DEBUG这两个选项。
在这里插入图片描述-O2:进行代码优化、优化等级为2;具体请查阅相关资料。
-DQT_NO_DEBUG:这个应该是个编译定义、编译选项?当出现这个定义时,一部分Qt代码将不会被编译到可执行文件中?假如这个定义是在链接库时生效的,还可以在编译时对库里面的代码进行选择?库里面的代码不是在编程这个库时就已经决定了吗,宏定义不是预编的一种吗?既然是预编译,那么对于一个库来收,在正式编译前,代码已经通过预编译进行了选择吧,为何再加-DQT_NO_DEBUG还有用?
-DQT_NO_DEBUG:这表示在编译时添加一个宏定义,和在代码中增加 #define QT_NO_DEBUG的效果一样。之所以加这个,是因为在Qt的头文件中,有很多地方都利用到了这个宏定义。加了这个定义后,Qt会相应地做了一些优化。
在这里插入图片描述


参考:
【Linux生成core文件相关配置,core文件调试示例】
【【问题记录】Ubuntu 22.04 环境下,程序报:段错误(核心已转储)怎么使用 core 文件和GDB调试器 解决?】

http://www.hkea.cn/news/111751/

相关文章:

  • 辛集城乡建设管理局网站网络营销网络推广
  • 阿里云部署一个自己做的网站吗电商网站搭建
  • 免费汽车租赁网站模板网站域名解析ip查询
  • 企业解决方案官网国内seo排名分析主要针对百度
  • 变态版手游石景山区百科seo
  • 阿里云控制台登录入口seo矩阵培训
  • wordpress苗木模板网站搜索排优化怎么做
  • 网站图片引导页怎么做重庆seo招聘
  • 如何做属于自己的领券网站郑州百度网站优化排名
  • 建设银行益阳市分行桃江支行网站公司页面设计
  • vps 网站上传网站seo优化是什么意思
  • wordpress cos腾讯云seo网站优化收藏
  • 鹤岗商城网站建设免费域名申请
  • 江苏三个地方疫情严重抖音视频排名优化
  • 竞价排名广告东莞关键词排名快速优化
  • 做视频网站要什么格式好网络营销公司怎么注册
  • 企业专业网站建设快速网站搭建
  • 武威建设网站的网站google谷歌搜索
  • 长沙公司做网站多少钱推广平台怎么做
  • 现在大家做电商网站用什么源码营销策略都有哪些
  • 可以做试卷的网站英语怎么说seo关键词排名优化系统源码
  • 网站怎么设置支付功能企业网站的主要类型有
  • 成都圣都装饰装修公司北京搜索优化排名公司
  • 境外建设网站贴吧互联网域名注册查询
  • 广州建站工作室淘客推广怎么做
  • 中国最大的网站建设公司百度广告联盟点击一次多少钱
  • wordpress单页主题营销seo手机关键词网址
  • dedecms做电影网站韩国最新新闻
  • 哪个网站做废旧好如何在百度上发布自己的广告
  • 网站表单及商品列表详情模板如何搭建自己的网站