gdb(ddd,kdevelop等)调试ZeroIce开发的应用程序,中断信号引起的问题
不作文,只记要点。
1.Ice::Application的程序框架默认对SIGHUP, SIGINT, SIGTERM进行处理。目的就是捕捉Ctrl+C发出信号有序地结束程序。这个功能扰乱了我们使用gdb进行调试。
1.1 Ice::Application通过CtrlCHandler类,使用pthread_sigmask对所有其它线程都阻塞上面三个信号。
1.2 可以参看线程sigwaitThread,以及Ice::Application类几个虚函数如何扩展Ctrl+C信号的处理。
2. gdb调试时,我们往往会通过Ctrl+C来手动中断正在运行的调试程序,但不幸的是这会发出一个SIGINT信号,即使你希望通过命令"handler ignore SIGINT"来阻止信号到达调试程序,但是你只能失望,结果是你希望Ctrl+C来中断调试程序,却结束了调试程序。
3. ddd调试,ddd是一个gdb前端,作为一个前端,你的前端窗口功能也可能会发中断信号到gdb,从而到达调试程序。例如你要观察调试程序的标准输出,你从view|excution window打开了一个窗口,这个窗口专门用来显示调试程序的输出。但是当你调整这个窗口的大小时,意外的事情发生,后端gdb居然接收到了一个SIGINT信号,也就是说当你调整窗口时,前端会中断一个后端的调试,窗口就绪后继续调试进行。这样一来,中断信号被调试的程序捕捉并结束了。
4. kdevelop调试,同样是一个gdb前端,当在调试程序在运行中,你希望通过代码界面添加某行的中断断点,这时候意外又来了。因为你使用gdb命令,都必须在gdb对调试程序中断的状态下进行,所以你在界面操作添加一个中断断点,其实就等同于,你Ctrl+C去中断程序,然后在gdb命令,添加断点,再继续调试。这样一来界面因为你的操作向后台gdb发送了一个Ctrl+C信号,又至使Ice::Application捕捉信号结束运行。
5. ddd提供四个调试窗口,变量监视窗口,源代码窗口,反汇编窗口,还有就是gdb命令控制窗口。在有源代码的情况下进行调试,是方便很多的,因为它自己在每一处暂停都会自动反汇编并关联到代码。虽然我们可以组合(disass /m, f等)命令,但调试体现还是ddd好。一但找不到源代码时,ddd的行为就不可期望(unexpecred)。要么一直忙,要么失去控制,反正就是无法调试下去。拿远程调试android为例,ndk提供的cxx-stl的库,它的源代码路径在 “/usr/local/google/buildbot/src/android/ndk-r15-release/out/build/tmp/build-130720/build-gnustl/static-armeabij4.9/build/include”。一但单步跳进了stl库的函数,由于找不到源代码,ddd的行为就很古怪,没办法继续调试下去。如果使用gdb还好,报错就是了,如下图,却不影响调试。

准备和建立远程调试,操作步骤比较烦,如果正调试到入正题的时候,调试器前端闹别扭,那就是相当烦的事了。而且远程调试通过 tty(或者叫COM),响应速度那个就是一个等字。
gdb(ddd,kdevelop等)调试ZeroIce开发的应用程序,中断信号引起的问题的更多相关文章
- 学习4412开发板gdb和gdbserver的调试
因为有很多的小伙伴是从单片机转过来的,用惯了单片机上的JLINK调试程序,换到Linux上非常的不习惯.确实,如果能设置断点,单步调试,查看变量,那确实是太爽了,那么在我们的Linux可以做到吗,答案 ...
- 用qemu+gdb tcp server+CDT调试linux内核启动-起步
用qemu+gdb tcp server+CDT调试linux内核启动-起步 说明: 环境信息与 用virtualbox+模拟串口+CDT调试linux内核 TCP IP协议栈-起步 提到的一样,并且 ...
- CLion远程调试嵌入式开发板程序
CLion远程调试嵌入式开发板程序 目录 CLion远程调试嵌入式开发板程序 1. 目的 2. 前提条件 3. CLion设置 3.1 设置一个Deployment 3.2 上传需要的目录到目标板子 ...
- 在Visual Studio上开发Node.js程序(2)——远程调试及发布到Azure
[题外话] 上次介绍了VS上开发Node.js的插件Node.js Tools for Visual Studio(NTVS),其提供了非常方便的开发和调试功能,当然很多情况下由于平台限制等原因需要在 ...
- 调试多线程 & 查死锁的bug & gcore命令 & gdb对多线程的调试 & gcore & pstack & 调试常用命令
gdb thread apply all bt 如果你发现有那么几个栈停在 pthread_wait 或者类似调用上,大致就可以得出结论:就是它们几个儿女情长,耽误了整个进程. 注意gdb的版本要高于 ...
- XE8 & IOS开发之免费证书真机调试:开发证书、AppID、开发授权profile的申请,附Debug真机调试演示(XCode7 Beta版或以上版本适用,有图有真相)
网上能找到的关于Delphi XE系列的移动开发的相关文章甚少,本文尽量以详细的图文内容.傻瓜式的表达来告诉你想要的答案. 原创作品,请尊重作者劳动成果,转载请注明出处!!! 注意,苹果发布Xcode ...
- GDB:从单线程调试到多线程调试(MFiX单步调试)
GDB:从单线程调试到多线程调试 1. 裸跑GDB 1.1 安装GDB sudo apt-get install gdb 1.2 编译程序 由于需要调试,因此编译的时候需要添加-g编译参数: 1.3 ...
- 搭建Spark源码研读和代码调试的开发环境
转载自https://github.com/linbojin/spark-notes/blob/master/ide-setup.md 搭建Spark源码研读和代码调试的开发环境 工欲善其事,必先利其 ...
- 学汇编的时候可以拿IDA之类的反汇编工具辅助学习,再用gdb或者IDA动态调试,跟踪每条指令的 执行结果。都不难
作者:潘安仁链接:https://www.zhihu.com/question/40720890/answer/87926792来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
随机推荐
- 第一个shell脚本(一)
第一个脚本 [root@ipha-dev71- exercise_shell]# ll total -rw-r--r-- root root Aug : test.sh [root@ipha-dev7 ...
- 一个简洁漂亮的jQuery拖放排序插件DDSort
拖放排序是WEB应用中常见的功能.虽然网上有很多别人已经造好的轮子,但是就我个人而言,没事就喜欢研究原理,自己造轮子,不管强大与否,简洁够用就是我的目标,再一个就是自己写的东西,应用起来得心应手,修改 ...
- 原来热加载如此简单,手动写一个 Java 热加载吧
1. 什么是热加载 热加载是指可以在不重启服务的情况下让更改的代码生效,热加载可以显著的提升开发以及调试的效率,它是基于 Java 的类加载器实现的,但是由于热加载的不安全性,一般不会用于正式的生产环 ...
- 使用eclipse在tomcat中设置项目启动的虚拟路径
很多时候我们在启动项目的时候都会在浏览器输入"localhost:+端口号+项目名称" 其实tomcat是可以省去这种麻烦的,通过设置项目的虚拟路径就可访问项目了 第一步 选择ec ...
- vue-class-component使用Mixins
vue-class-component提供了mixinshelper函数,以类样式的方式使用mixins.通过使用mixins帮助程序,TypeScript可以推断mixin类型并在组件类型上继承它们 ...
- React + MobX 状态管理入门及实例
前言 现在最热门的前端框架,毫无疑问是React. React是一个状态机,由开始的初始状态,通过与用户的互动,导致状态变化,从而重新渲染UI. 对于小型应用,引入状态管理库是"奢侈的&qu ...
- 04 python学习笔记-函数、函数参数和返回值(四)
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率.Python提供了许多内建函数,比如print(),我们也可以自己创建函数,这叫做用户自定 ...
- Python调试工具
1. 日志 通过日志或者print来打印变量.必要时可以打印locals()和globals() 建议使用logging.debug()来代替print,这样到了正式环境,就可以统一删除这些日志. 2 ...
- krry-transfer ⏤ 基于 element 的升级版穿梭框组件发布到 npm 啦
博客地址:https://ainyi.com/81 基于 element ui 的==升级版穿梭框组件==发布到 npm 啦 看过我之前博客的同学或许知道我之前写过关于 element 穿梭框组件重构 ...
- 快速学习ggplot2
R语言里面一个比较重要的绘图包——ggplot2,是由Hadley Wickham于2005年创建,于2012年四月进行了重大更新,作者目前的工作是重写代码,简化语法,方便用户开发和使用.ggplot ...