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来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
随机推荐
- Https工作流程图
- jQuery插件图片懒加载lazyload
来自XXX的前言: 什么是ImageLazyLoad技术 在页面上图片比较多的时候,打开一张页面必然引起与服务器大数据量的 交互.尤其是对于高清晰的图片,占的几M的空间.ImageLazyLoad技术 ...
- 通过FeignClient接收shaded的javabean的JSON序列化
问题说明 最近做了关于flink的需求. 现在需要通过HTTP访问FLINK的 RESTAPI, rest 接口的JSON 非常庞大而复杂. 那么怎么去完整的接收数据呢? 方法一就是手写部分需要的Ja ...
- mybatis的插件机制
一.mybatis的插件介绍 关于mybatis的插件,我想大家也都用过,就比如最常用的逆向工程,根据表结构生成model,dao,xml文件,还有分页插件,那这些插件的工作原理是怎么样的呢,就比如分 ...
- Net Core中 使用Middleware 实现反向代理
有这样的一个需求,我们要拦截某些特定的请求,并将它们重新定向到另一台服务器中,然而客户端并不知情. 在NetCore中我们可以用中间件来实现, 首先创建项目: 我这里只有2.1 Version 的 添 ...
- JVM参数及调优
## 3.2.1 JVM参数及调优 ### 调优基本概念 在调整JVM性能时,通常有三个组件需要考虑:1. 堆大小调整2. 垃圾收集器调整3. JIT编译器 大多数调优选项都与调整堆大小和选择合适的垃 ...
- 一个自动管理项目的Makefile(C语言)
Linux 是所有嵌入式软件工程师绕不过去的坎, makefile 是在Linux系统中绕不过去的坎. 花了几天时间初步学习和了解了makefile 的作用以及功能,并且制作了一个通用型的makefi ...
- MIT线性代数:2.消元法
- [知识图谱]利用py2neo从Neo4j数据库获取数据
# -*- coding: utf-8 -*- from py2neo import Graph import json import re class Neo4jToJson(object): &q ...
- oop面向对象知识总结 静态成员和友元
第十一章 静态成员和友元 11.1 静态成员 1.C++类当中的静态数据成员仍借用保留字static,但是与之前的静态全局变量,静态局部变量以及静态函数没有关系. 2.静态数据成员不占用具体对象的数据 ...