不作文,只记要点。

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开发的应用程序,中断信号引起的问题的更多相关文章

  1. 学习4412开发板gdb和gdbserver的调试

    因为有很多的小伙伴是从单片机转过来的,用惯了单片机上的JLINK调试程序,换到Linux上非常的不习惯.确实,如果能设置断点,单步调试,查看变量,那确实是太爽了,那么在我们的Linux可以做到吗,答案 ...

  2. 用qemu+gdb tcp server+CDT调试linux内核启动-起步

    用qemu+gdb tcp server+CDT调试linux内核启动-起步 说明: 环境信息与 用virtualbox+模拟串口+CDT调试linux内核 TCP IP协议栈-起步 提到的一样,并且 ...

  3. CLion远程调试嵌入式开发板程序

    CLion远程调试嵌入式开发板程序 目录 CLion远程调试嵌入式开发板程序 1. 目的 2. 前提条件 3. CLion设置 3.1 设置一个Deployment 3.2 上传需要的目录到目标板子 ...

  4. 在Visual Studio上开发Node.js程序(2)——远程调试及发布到Azure

    [题外话] 上次介绍了VS上开发Node.js的插件Node.js Tools for Visual Studio(NTVS),其提供了非常方便的开发和调试功能,当然很多情况下由于平台限制等原因需要在 ...

  5. 调试多线程 & 查死锁的bug & gcore命令 & gdb对多线程的调试 & gcore & pstack & 调试常用命令

    gdb thread apply all bt 如果你发现有那么几个栈停在 pthread_wait 或者类似调用上,大致就可以得出结论:就是它们几个儿女情长,耽误了整个进程. 注意gdb的版本要高于 ...

  6. XE8 & IOS开发之免费证书真机调试:开发证书、AppID、开发授权profile的申请,附Debug真机调试演示(XCode7 Beta版或以上版本适用,有图有真相)

    网上能找到的关于Delphi XE系列的移动开发的相关文章甚少,本文尽量以详细的图文内容.傻瓜式的表达来告诉你想要的答案. 原创作品,请尊重作者劳动成果,转载请注明出处!!! 注意,苹果发布Xcode ...

  7. GDB:从单线程调试到多线程调试(MFiX单步调试)

    GDB:从单线程调试到多线程调试 1. 裸跑GDB 1.1 安装GDB sudo apt-get install gdb 1.2 编译程序 由于需要调试,因此编译的时候需要添加-g编译参数: 1.3 ...

  8. 搭建Spark源码研读和代码调试的开发环境

    转载自https://github.com/linbojin/spark-notes/blob/master/ide-setup.md 搭建Spark源码研读和代码调试的开发环境 工欲善其事,必先利其 ...

  9. 学汇编的时候可以拿IDA之类的反汇编工具辅助学习,再用gdb或者IDA动态调试,跟踪每条指令的 执行结果。都不难

    作者:潘安仁链接:https://www.zhihu.com/question/40720890/answer/87926792来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...

随机推荐

  1. Linux下yum与apt-get

    linux系统基本上分两大类: 1.RedHat系列:Redhat.Centos.Fedora等 2.Debian系列:Debian.Ubuntu等 RedHat 系列 1 常见的安装包格式 rpm包 ...

  2. python2与3实际中遇到的区别

    1.type(1/2) python2是向下取整,0,为int:python3是正常除法,0.5,为float 2.

  3. MAC idea&eclipse快捷键--笔记

    idea: 1. command+d 删除行 2. command+o 重写父类方法 3. option+command+v  自动补全变量 4. 将普通java项目变成maven项目 在项目名称上点 ...

  4. 怎么在.NetCore3.0 中使用Log4net 写日志 及读取配置文件的信息

    1:安装Log4Net的 NuGet 包: 我们通常之需要安装这一个包即可,其他的主包会自动被添加进来: insatll-package  Microsoft.Extensions.Logging.L ...

  5. Java基础(二十五)Java IO(2)文件File类

    File类是一个与流无关的类.File类的对象可以获取文件及其文件所在的目录.文件的长度等信息. 1.File对象的常用构造方法. (1)File(String pathname) File file ...

  6. fenby C语言

    P1框架 1#include <stdio.h> 2 3int main(){ 4    printf(“C语言我来了”); 5    return 0; 6} P2main()门 P3计 ...

  7. SpringBoot与MybatisPlus3.X整合示例(十六)

    包含 分页.逻辑删除.自定义全局操作 等绝大部分常用功能的使用示例,相当于大整合的完整示例 pom.xml <dependencies> <dependency> <gr ...

  8. 设计模式C++描述----13.代理(Proxy)模式

    一. 举例说明 我们有时打开一个网站时会发现有这样的现象,网站上的文字都显示出来了,但是上面的图片还没显示,要等一会才能显示. 这些未打开的图片的位置上,还是会有图片框和一些等待的信息的,这就是代理模 ...

  9. windows 10 环境下 使用Anaconda搭建 TensorFlow 环境

    ##大致步骤 1 安装Anaconda 2 在Anaconda中建立虚拟TensorFlow的虚拟环境 建立虚拟环境的命令是 conda  create -n tensorflow python=3. ...

  10. javadoc的使用

    在进行项目开发过程中,项目接口文档是很重要的一块内容,在java项目中我们可以用swagger,asciidoc,javadoc等方式来生产文档,而其中最基本的文档生成方式就是javadoc,它一般用 ...