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来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
随机推荐
- 【笔记】关于N-Way K-Shot 分类问题的理解
Time: 2019年10月27日 Author:Veagau 在看讲Repitle的论文[On First-Order Meta-Learning Algorithm]时,实验环节对N-Way K- ...
- 玩转 RTC时钟库 DS1302
1.前言 最近博主在弄8266编程的时候,偶然发现两个全新时钟模块压仓货: DS1302 DS3231 为了避免资源浪费以及重复编写代码,博主还是抱着尝试的心态去寻找能够同时兼容 DS ...
- javascript获取坐标/滚动/宽高/距离
坐标(鼠标/触摸) event.screenX 鼠标/触摸,相对于显示屏的X坐标 event.screenY 鼠标/触摸,相对于显示屏的Y坐标 event.clientX 鼠标/触摸,相对于浏览器视口 ...
- Django中ORM的优化
1. exists( ) 什么时候用 count( ) 和 len( )什么时候合适, 用values( )或values_list( )只取需要的列的数据 iterator()对数据对象生成迭代器, ...
- 透明度设置opacity
透明度设置opacity属性 示例 <!DOCTYPE html> <html> <head> <style> div { background-col ...
- zabbix清理监控历史mysql数据
问题描述: 今天同事说有个zabbix监控数据库历史数据越来越多了, 让我帮忙清一下,顺便熟悉练练手,做个笔记 zabbix监控运行一段时间以后,会留下大量的历史监控数据 zabbix数据库一直在增大 ...
- ORM之多表操作
一.创建模型 from django.db import models # Create your models here. class Book(models.Model): nid = model ...
- Web for pentester_writeup之SQL injections篇
Web for pentester_writeup之SQL injections篇 SQL injections(SQL注入) Example 1 测试参数,添加 and '1'='1, 'and ' ...
- CSPS Oct目标
超过skyh 删了一些sb话,不过目标不会变的
- 通过ISO镜像简单搭建本地yum仓库
本文参考链接:https://segmentfault.com/a/1190000015155966 *有时候在我们本地搭建一些Linux上的程序运行环境或者安装一些软件的时候,难免会遇到需要使用yu ...