linux下DDD进行调试

  categories:资料  author:

在嵌入式程序开发过程中,程序员要进行大量的调试,以此验证程序的正确性,修改潜在的错误。调试器对于程序员来说是不可或缺的必备工具。在Linux环境 中,有很多调试工具和调试辅助工具,例如GDB、XXGDB、RHIDE、XWPE、GVD和DDD等。其中,DDD是命令行调试器的图形前端,除了一般 的程序调试功能以外,还具有交互式图形数据显示的功能。它在嵌入式应用开发中也十分出色。本文主要讲述DDD(Data Display Debugger)的使用方法。

1.认识DDD

GNU DDD是命令行调试程序,如GDB、DBX、WDB、Ladebug、JDB、XDB、Perl Debugger或Python Debugger的可视化图形前端。它特有的图形数据显示功能(Graphical Data Display)可以把数据结构按照图形的方式显示出来。DDD最初源于1990年Andreas Zeller编写的VSL结构化语言,后来经过一些程序员的努力,演化成今天的模样。DDD的功能非常强大,可以调试用C\C++、Ada、 Fortran、Pascal、Modula-2和Modula-3编写的程序;可以超文本方式浏览源代码;能够进行断点设置、回溯调试和历史纪录编辑;具有程序在终端运行的仿真窗口,并在远程主机上进行调试的能力;图形数据显示功能(Graphical Data Display)是创建该调试器的初衷之一,能够显示各种数据结构之间的关系,并将数据结构以图形化形式显示;具有GDB/DBX/XDB的命令行界面,包括完全的文本编辑、历史纪录、搜寻引擎。

DDD是开源软件,用户可以去http://www.cs.tubs.de/softech/ddd/下载.rpm格式的DDD源码文件。

图1显示的是DDD的主窗口。它主要由选单栏、工具条、数据窗口、源文件窗口、机器码窗口、控制台和命令工具窗口等几部分组成。其中,数据窗口用于观察复杂的数据结构,在删除数据之后,显示仍然有效;源文件窗口显示源代码、断点和当前执行到达的位置,选择该窗口中的“Display”项,可以显示任意表达式的值;机器码窗口显示当前所选函数的机器代码,但仅对于GDB来说是可用的;在Debugger控制台里,用户可以与DDD内置调试器的命令行接口进行交互,等同于执行命令工具栏中的命令。


图1 DDD的主窗口

2.DDD运行机理

在设计DDD的时候,主创人员决定把它与GDB之间的耦合度尽可能降小。因为像GDB这样的开源软件,更新要比商业软件快。所以为了使GDB的变化不会影响到DDD,在DDD中,GDB是作为独立的进程运行的,通过命令行接口与DDD进行交互。

DDD 的运行机理如图2所示。它显示了用户、DDD、GDB和被调试进程之间的关系。为了使响应时间变小,DDD和GDB之间的所有通信都是异步进行的。在 DDD中发出的GDB命令都会与一个回调例程相连,放入命令队列中。这个回调例程在合适的时间会处理GDB的输出。例如,如果用户手动输入一条GDB的命令,DDD就会把这条命令与显示GDB输出的一个回调例程连起来。一旦GDB命令完成,就会触发回调例程,GDB的输出就会显示在DDD的命令窗口中。


图2 DDD的运行机理

DDD 在事件循环时等待用户输入和GDB输出,同时等着GDB进入等待输入状态。当GDB可用时,下一条命令就会从命令队列中取出,送给GDB。GDB到达的输出由上次命令的回调过程来处理。这种异步机制避免了DDD在等待GDB输出时发生阻塞现象,到达的事件可以在任何时间得到处理。

DDD和GDB的分离使得DDD运行速度变慢,但这种方法还有很多好处。例如,用户可以把GDB调试器换成其它调试器,如DBX等。另外,还可以在不同的机器上运行GDB和DDD。

3. DDD调试示例

现在就用DDD来实际调试下面sample.c这段程序,为了节省空间,去掉了所有的注释。

#include <stdio.h>
#include <stdlib.h>

#define MAXINPUTSTRINGSIZE 5
阅读全文

宇宙最强调试器DDD

  categories:资料  author:

在写程序的时候,经常会遇到一些问题,比如某些变量计算结果不是我们预期的那样,这时我们需要对程序进行调试。本文主要介绍调试C/C++在Linux操作系统下主要的调试工具。

在Linux下写程序,C/C++主要的编译器有GCC/G++,ICC等,像我等穷码农,最喜欢GCC了,很大原因是他免费!所以,我们以GCC/G++为例介绍主要的调试工具。

分以下几个内容介绍:

1、调试之前的工作

2、选择调试工具

3、调试步骤

调试之前的工作
编译器在编译阶段需要产生可供调试的代码,才能被调试器调试。可以如下做:

gcc -g -ggdb ./yourcode.c -o yourapp.exe

这样编译代码可以产生供gdb调试的符号信息。
选择调试工具
gdb当时我们要使用的调试工具,不过他是命令行中使用的,多少有点不方便。

CGDB和DDD都是基于GDB开发的,他们只是增加了更加容易交互的界面。其中CGDB也是在命令行中使用的,使用方式与GDB一样,只是增加了代码显示的界面。

DDD也是GNU开发的,他也是基于GDB的,只是使用了可视化界面,比CGDB更加容易操作。

在有些情况下,我的Linux上可能没有装X-Sever,这样就没有图形显示功能,此时我们只能用命令行方式使用调试工具,所以gdb和cgdb应用更广泛些。一般我会使用CGDB,他的操作跟gdb完全类似,很容易上手。

调试
使用下面的命令启动程序。

cgdb ./youapp.exe

注意,这里我们使用的是cgdb,如果你没有安装cgdb,首先应该安装它!ubuntu用户的安装方式如下:
sudo apt-get install cgdb

启动软件后,常用的几个命令因该熟练掌握:
1、设置断点命令,程序在执行时遇到断点会停下来,执行停止后可以进行变量值的检查。

break [line_number]

例如:break youcode.cpp:32,这个命令是说在youcode.cpp第32行代码处设置断点,程序运行至此时会停下来。
2、显示变量的值,程序在断点处停止时可以打印变量的值。

print [var]

例如:print a,这句命令表示打印变量a的值。print也可以缩写成p。… 阅读全文

Arthas使用指南

  categories:资料  author:

Arthas 能为你做什么?

  • 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  • 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  • 遇到问题无法在预发 debug 一下,难道只能通过加日志再重新预发布吗?
  • 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现,怎么办?
  • 是否有一个全局视角来查看系统的运行状况?
  • 有什么办法可以监控到容器和中间件的实时运行状态?

Arthas 是基于 Greys 进行二次开发的全新在线诊断工具,利用Java6的Instrumentation特性,动态增强你所指定的类,获取你想要到的信息, 采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,让你在定位、分析诊断问题时看每一个操作都看起来是那么的 666

阿里已开源 https://github.com/alibaba/ar…

Arthas安装及使用

下载压缩包,上传到需要被诊断的机器, 解压缩

  • 安装: 执行 ./install.sh
  • 启动: 执行 ./as.sh pid

常用命令

dashboard

当前系统的实时数据面板

thread

查看当前

阅读全文

基于Linux生态的十大AI开源框架盘点

  categories:资料  author:

前不久,雷锋网曾盘点了一系列机器学习相关的开源平台,包括谷歌的 TensorFlow、微软的 CNTK 以及百度的 PaddlePaddle 等等(详情见文末“相关阅读”)。这些平台各具特点,其中某些已经在业内得到了广泛认可和应用。

与此前不同,本文将从开发者的角度出发,特别是针对开发者中为数众多的 Linux 系统和 Mac 系统用户,奉上一篇针对泛 Linux 生态的顶级人工智能开源工具盘点(当然,有些工具也并非只兼容 Linux)。

1. Deeplearning4j:为 Java 用户量身定制

开发者必备:基于Linux生态的十大AI开源框架盘点

Deeplearning4j(Deep Learning For Java)是 Java 和 Scala 环境下的一个开源分布式的深度学习项目,由总部位于美国旧金山的商业智能和企业软件公司 Skymind 牵头开发,并得到了腾讯的投资。正如它的命名,Deeplearning4j 的运行需要 Java 虚拟机 JVM 的支持。

Deeplearning4j 团队在官网表示,他们希望通过一些深度学习算法的开发,将商业带入智能化数据的时代。也正是为了实现这一理想,惠及更多的用户,因此选择了移植性更好的 Java 环境来实现这些算法。目前,Deeplearning4j 的这些算法已经在谷歌、Facebook 和微软等平台得到了广泛应用。

值得一提的是,为了便于开发者自由定制,Deeplearning4j

阅读全文

Kodi 中文版开源多媒体影音中心播放器

  categories:资料  author:

如果你是个高清电影爱好者,你一定会考虑如何将客厅的电脑打造成一台强大的家庭影院影音播放中心!然而,简单地接上电脑+键盘鼠标,对着电视上极小的窗口和字体操作半天绝对是一个“糟糕麻烦”的体验。

Kodi (原名 XBMC) 是一款经典免费开源、跨平台且极其强大专业的多媒体影音中心软件播放器,包含了专业的影音内容管理以及解码播放功能一体,提供适合在电视/投影/大屏幕上显示的全屏界面,无线手机遥控操作方式,以及功能相当丰富的插件扩展,绝对是打造家庭影院 (影音中心) 和私人电影库的必备神器!

Kodi – 用更优雅专业的方式来播放和管理电影视频音乐

Kodi 能带给你更优雅、舒适的观影体验,可以说是目前同类软件中当之无愧的 No·1。首先,免费开源跨平台+配置要求低的特性让 Kodi 不仅能在 Windows、Mac、Linux 电脑上使用,甚至在 Android、iOS 手机/平板以及像「树莓派」这样的微型电脑或很多安卓机顶盒(网络播放器)上流畅运行,兼容性和适用范围极广。

 

其次,Kodi 是一个万能格式高清播放器,支持解码播放几乎所有流行的音频和视频格式,3D、4K 高清什么的都没问题。它集电影视频、音乐、图片管理和播放于一身,不仅能读取本机硬盘、移动硬盘的影音内容,最重要的是它还能通过局域网播放和管理其他电脑、NAS (网络存储服务器) 里的内容。这使得任何人都能轻松将手头上的电脑设备变成客厅中强大无比的网络影音播放机。

 

再次,Kodi 专为大电视、大尺寸屏幕和投影优化的大字体全屏界面、可以通过手机 APP 实现无线遥控控制、支持 AirPlay / DLNA 无线投射串流等功能特性也让其更加实用方便。

 

不过,看到这里你可能还觉得它比起普通的播放器没什么特别之处,其实 Kodi 真正的亮点主要还是在于它丰富强大的插件扩展。… 阅读全文

SpringBoot配置数据源DataSource

  categories:资料  author:

SpringBoot配置数据源DataSource

1. 使用Spring Boot默认数据源
1.1 引入POM依赖
在pom文件中直接依赖官方提供的spring-boot-start-jdbc模块或者spring-boot-start-data-jpa模块。

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

1.2 数据库配置
Spring Boot支持.properties格式和.yml格式配置文件,根据个人习惯可以随意选择(笔者推荐yml格式,可读性更强)。在classpath路径下创建application.properties文件或者application.yml文件。两种类型配置分别如下

.yml配置文件
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost/test
username: root
password: 123456

注意: .yml类型文件,属性名后面冒号和值之间必须有一个空格,如username: root是正确格式, 但是useranme:root格式就是错误的。

.properties文件配置
spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

下面是 相关的 数据源 配置可选项目

datasource… 阅读全文

Ignite Getting Started

  categories:资料  author:

Ignite是什么?

Apache Ignite是一个以内存为中心的分布式数据库缓存处理平台,支持事务、分析以及流式负载,可以在PB级数据上享有内存级的性能。

1.1.Ignite定位

Ignite是不是内存数据库?

,虽然Ignite的固化内存在内存和磁盘中都工作得很好,但是磁盘持久化可以禁用从而成为一个纯粹的内存数据库,支持SQL和分布式关联。

Ignite是不是内存数据网格(IMDG)?

,Ignite是一个全功能的分布式键-值数据网格,它既可以用于纯内存模式,也可以带有Ignite的原生持久化,它也可以与任何第三方数据库集成,包括RDBMS和NoSQL。
Ignite是不是一个分布式缓存?

,如果禁用原生持久化,Ignite就是一个分布式缓存,它实现了JCache规范(JSR107),并且提供了比规范更多的功能,包括分区和复制分布式模式、分布式ACID事务、SQL查询、原生持久化等等。

Ignite是不是分布式数据库?

,在整个集群的多个节点中,Ignite中的数据要么是分区模式的,要么是复制模式的,这给系统带来了伸缩性,增加了弹性。Ignite可以自动地控制数据如何分区,另外,开发者也可以插入自定义(关系)函数,以及为了提高效率将部分数据并置在一起。

Ignite是不是关系型SQL数据库?

不完整,尽管Ignite的目标是和其他的关系型SQL数据库具有类似的行为,但是在处理约束和索引方面还是有不同的。Ignite支持一级和二级索引,但是只有一级索引支持唯一性,Ignite还不支持外键约束。

Ignite是不是磁盘或者只有内存的存储?

都是,Ignite中的原生持久化是可以开关的,这使得Ignite可以持有比可用内存量大得多的数据。尤其是,少量的操作型数据集可以只保存在内存中,而更大的无法放在内存中的数据集,可以放在磁盘上,将内存作为一个缓存层,可以获得更好的性能。

Ignite是不是一个NoSQL数据库?

不确切,和其他的NoSQL数据库一样,Ignite支持高可用和水平伸缩,但是,和其它的NoSQL数据库不同,Ignite支持跨越整个集群的ACID事务和SQL。

Ignite是不是事务型数据库?

不完整,ACID事务是支持的,但是仅仅在键-值API级别,Ignite还支持跨分区的事务,这意味着事务可以跨越不同服务器不同分区中的键。

在SQL层,Ignite支持原子性,还不是事务型一致性,社区计划在未来的版本中实现SQL事务。

Ignite是不是一个多模型数据库?

,Ignite数据的建模和访问,同时支持键值和SQL,另外,Ignite还为在分布式数据上的计算处理,提供了强大的API。

Ignite是不是一个键-值存储?

阅读全文

分布式系统唯一ID生成方案汇总

  categories:资料  author:

系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,也常常为这个问题而纠结。生成ID的方法有很多,适应不同的场景、需求以及性能要求。所以有些比较复杂的系统会有多个ID生成的策略。下面就介绍一些常见的ID生成策略。

1. 数据库自增长序列或字段

最常见的方式。利用数据库,全数据库唯一。

优点:

1)简单,代码方便,性能可以接受。

2)数字ID天然排序,对分页或者需要排序的结果很有帮助。

 

缺点:

1)不同数据库语法和实现不同,数据库迁移的时候或多数据库版本支持的时候需要处理。

2)在单个数据库或读写分离或一主多从的情况下,只有一个主库可以生成。有单点故障的风险。

3)在性能达不到要求的情况下,比较难于扩展。

4)如果遇见多个系统需要合并或者涉及到数据迁移会相当痛苦。

5)分表分库的时候会有麻烦。

优化方案:

1)针对主库单点,如果有多个Master库,则每个Master库设置的起始数字不一样,步长一样,可以是Master的个数。比如:Master1 生成的是 1,4,7,10,Master2生成的是2,5,8,11 Master3生成的是 3,6,9,12。这样就可以有效生成集群中的唯一ID,也可以大大降低ID生成数据库操作的负载。

 

2. UUID

常见的方式。可以利用数据库也可以利用程序生成,一般来说全球唯一。

优点:

1)简单,代码方便。

2)生成ID性能非常好,基本不会有性能问题。

3)全球唯一,在遇见数据迁移,系统数据合并,或者数据库变更等情况下,可以从容应对。

 

缺点:

1)没有排序,无法保证趋势递增。

2)UUID往往是使用字符串存储,查询的效率比较低。

3)存储空间比较大,如果是海量数据库,就需要考虑存储量的问题。

4)传输数据量大

5)不可读。

 

3. UUID的变种

1)为了解决UUID不可读,可以使用UUID to

阅读全文

Flex 布局教程实例

  categories:资料  author:

今天介绍常见布局的Flex写法。

你会看到,不管是什么布局,Flex往往都可以几行命令搞定。

我只列出代码,详细的语法解释请查阅《Flex布局教程:语法篇》。我的主要参考资料是Landon Schropp的文章和Solved by Flexbox。

一、骰子的布局

骰子的一面,最多可以放置9个点。

下面,就来看看Flex如何实现,从1个点到9个点的布局。你可以到codepen查看Demo。

如果不加说明,本节的HTML模板一律如下。


<div class="box">
  <span class="item"></span>
</div>

上面代码中,div元素(代表骰子的一个面)是Flex容器,span元素(代表一个点)是Flex项目。如果有多个项目,就要添加多个span元素,以此类推。

1.1 单项目

首先,只有左上角1个点的情况。Flex布局默认就是首行左对齐,所以一行代码就够了。


.box {
  display:
阅读全文

ignite系列数据处理

  categories:资料  author:

使用ignite的一个常见思路就是将现有的关系型数据库中的数据导入到ignite中,然后直接使用ignite中的数据,相当于将ignite作为一个缓存服务,当然ignite的功能远不止于此,下面以将ignite集成进java服务的方式进行演示ignite的数据存储和查询相关的功能。由于个人习惯,示例演示没有使用测试代码,而是使用rest接口演示。

​ 在讲数据加载之前,ignite中存储的几种模式(LOCAL, REPLICATED, PARTITIONED):

LOCAL:本地模式,数据都存储在本地,无数据再平衡,类似常见的存储服务;

PARTITIONED:分区模式,数据分散到集群中的各个节点,分区模式适合存储数量庞大的数据

如图所示是设置了Backup备份数的,默认备份数是0,如果分区模式下不设置备份数的话则会存在丢失数据的风险。

REPLICATED:复制模式,有数据再平衡过程,主节点(Primary)数据与分区模式的一致,只是复制模式默认备份了除主节点数据外的其余数据。复制模式适合存储数据量小,增长不快的数据。

分区模式和复制模式各有优点和缺点,具体选择要根据实际场景的特点去权衡:

模式 优点 缺点
分区模式(PARTITIONED) 能存储海量数据,频繁更新对其影响不大 查询缓存涉及到数据移动,对查询性能有影响
复制模式(REPLICATED) 适合存储数据量不大的数据,数据查询性能稳定 频繁更新对其影响较大

1,数据加载

这里使用mybatis查询MYSQL里的数据然后存入ignite,完整代码可以参考:

https://github.com/cording/ignite-example

为了演示,需要先在MYSQL中生成样本数据,相关sql脚本为ignite-example\src\main\resources\import.sql,执行该SQL脚本即可完成表的创建和测试数据的初始化。

在配置文件中定义缓存

                <bean class="org.apache.ignite.configuration.CacheConfiguration">
                    <property name
阅读全文


快乐成长 每天进步一点点      京ICP备18032580号-1