随笔分类 -  GCC/G++/GDB/core dump/调试

摘要:/* co-gcc.lnt: This is the seed file for configuring Lint for use with GCC versions 2.95.3 and later. Like all compiler options files this file is intended to be used as follows: lint co-gcc.lnt source-files-to-be-linted Some of the information that co-gcc.lnt requires needs to b... 阅读全文
posted @ 2012-10-21 21:38 dzqabc 阅读(4483) 评论(0) 推荐(1) 编辑
摘要:基础知识介绍:MIPS32的内部寄存器。最简单的办法就是通过GDB的命令,可以获得下面的列表(gdb) info registers zero at v0 v1 a0 a1 a2 a3R0 00000000 00000001 0000000f 0000000f 00000000 0000000f 0000000e 00000071 t0 t1 t2 t3 t4 t5 t6 t7R8 00000072 00000001 00000203 80003cb1 80003cb0 0000007f 00000080 00000008 s0 s1 s2 s3 s4 s5 s6 s7R16 00000001 阅读全文
posted @ 2012-09-05 00:25 dzqabc 阅读(10427) 评论(0) 推荐(0) 编辑
摘要:基础知识介绍: 1. MIPS32的内部寄存器。 最简单的办法就是通过GDB的命令,可以获得下面的列表 (gdb) info registers zero at v0 v1 a0 a1 a2 a3 R0 00000000 00000001 0000000f 0000000f 00000000 0000000f 0000000e 00000071 t0 t1 t2 t3 t4 t... 阅读全文
posted @ 2012-08-17 00:03 dzqabc 阅读(3717) 评论(0) 推荐(0) 编辑
摘要:指令长度和寄存器个数 MIPS的所有指令都是32位的,指令格式简单。不像x86那样,x86的指令长度不是固定的,以80386为例,其指令长度可从1字节(例如PUSH)到17字节,这样的好处代码密度高,所以MIPS的二进制文件要比x86的大大约20%~30%。而定长指令和格式简单的好处是易于译码和更符合流水线操作,由于指令中指定的寄存器位置是固定的,使得译码过程和读指令的过程可以同时进行,即固定字段译码。32个通用寄存器,寄存器数量跟编译器的的要求有关。寄存器分配在编译优化中是最重要的优化之一(也许是做重要的)。现在的寄存器分配算法都是基于图着色的技术。其基本思想是构造一个图,用以代表分配寄存器 阅读全文
posted @ 2012-08-16 23:59 dzqabc 阅读(5947) 评论(0) 推荐(1) 编辑
摘要:MIPS有32个通用寄存器($0-$31),各寄存器的功能及汇编程序中使用约定如下:下表描述32个通用寄存器的别名和用途;REGISTERNAMEUSAGE$0$zero常量0(constant value 0)$1$at保留给汇编器(Reserved for assembler)$2-$3$v0-$v1函数调用返回值(values for results and expression evaluation)$4-$7$a0-$a3函数调用参数(arguments)$8-$15$t0-$t7暂时的(或随便用的)$16-$23$s0-$s7保存的(或如果用,需要SAVE/RESTORE的)(sa 阅读全文
posted @ 2012-08-16 23:56 dzqabc 阅读(13918) 评论(0) 推荐(2) 编辑
摘要:错误信息为:一个实例化的逻辑错误导致程序中止.在what()函数中不能使用NULL来构造basic_string的对象.错误 用法的演示:============================#include <string>using namespace std;void main(void){//string a(NULL);//错误用法//string b = NULL;//错误用法string a("");//正确用法string b = "";//正确用法string c;//正确用法a = "aaa";b = 阅读全文
posted @ 2012-06-29 23:10 dzqabc 阅读(3398) 评论(0) 推荐(0) 编辑
摘要:条件变量函数操作相关函数说明初始化条件变量pthread_cond_init 语法基于条件变量阻塞pthread_cond_wait 语法解除阻塞特定线程pthread_cond_signal 语法在指定的时间之前阻塞pthread_cond_timedwait 语法在指定的时间间隔内阻塞pthread_cond_reltimedwait_np 语法解除阻塞所有线程pthread_cond_broadcast 语法销毁条件变量状态pthread_cond_destroy 语法初始化条件变量使用 pthread_cond_init(3C) 可以将 cv 所指示的条件变量初始化为其缺省值,或者指定 阅读全文
posted @ 2012-05-02 07:54 dzqabc 阅读(5089) 评论(0) 推荐(2) 编辑
摘要:1.request for member 'XXX' in 'XXX', which is of non-class type 'XXX*' 这个告警一般是因为把对象指针当做对象用来访问其成员了。从后面的[non-class type 'XXX*']可以看出在上下文中是认识当前类型的,并非是因为没有包含头文件哦。2.没有规则可以创建“XXX”需要的目标“XXX”完全重新编译一遍就可以了.3.redefinition of "XXX" previous definition of 'XXX'往往是 阅读全文
posted @ 2012-03-28 23:55 dzqabc 阅读(659) 评论(0) 推荐(0) 编辑
摘要:数组定义时长度可以使用变量不是很清楚了,自己写的是可以的,可能新版本编译器已经支持函数调用时动态分配数组空间了吧,使用g++是编译成功了。 动态长度的栈区数组是C99的特性。在C99之前,在栈区分配动态大小的内存块是使用alloca函数,不过由于不在堆中,分配出来的内存不需要释放滴int len;c 阅读全文
posted @ 2012-02-12 22:27 dzqabc 阅读(4029) 评论(0) 推荐(0) 编辑
摘要:1. core文件的简单介绍在一个程序崩溃时,它一般会在指定目录下生成一个core文件。core文件仅仅是一个内存映象(同时加上调试信息),主要是用来调试的。 1.1 确认core文件的归属 file core可以输出是由哪个程序生成的core 2. 开启或关闭core文件的生成用以下命令来阻止系统 阅读全文
posted @ 2012-01-20 23:17 dzqabc 阅读(91107) 评论(0) 推荐(14) 编辑
摘要:__attribute__是GNU C提供的一种机制。__attribute__可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。 __attribute__书写特征是:__attribute__前后都有两个下划线,并切后面会紧跟一对原括弧,括弧里面是相应的__attribute__参数。 __... 阅读全文
posted @ 2012-01-14 15:42 dzqabc 阅读(474) 评论(0) 推荐(0) 编辑
摘要:众所周知,程序为了提高访问效率,编译器在编译的时候,进行字节对齐。程序员也可以字节指定对齐方式。 Win32下的为progma指令,具体来说 #pragma pack(push) //保存原对齐状态#pragma pack(4)//设定为4字节对齐struct test{ int a;};#pragma pack(pop)//恢复对齐状态在linux下,gcc是默认的编译器。g++ 支持pro... 阅读全文
posted @ 2012-01-14 15:23 dzqabc 阅读(1387) 评论(0) 推荐(0) 编辑
摘要:编译器对结构在编译过程中会优化对齐,由于编译器的内存对齐,当一个char变量独立存在时,会分配一个int大小的空间,当两个char连续存在时,会给两个char分配一个int大小的空间. class CMemoryTest { int a; char b; int c; char d; }; class CMemoryTest1 { int a;... 阅读全文
posted @ 2012-01-14 15:02 dzqabc 阅读(3549) 评论(0) 推荐(0) 编辑
摘要:新版本的录制程序终于快完工了,在添加了一个新特性“报警录制”后,就开始测试了。 一开始就不顺利:程序正常运行一段时间后就会崩溃,由于程序添加了守护进程,在崩溃后会自动重启。 因此测试得到的结果就是:程序运行一段时间后就自动重启,并不断持续;有时几个小时重启一次,有时甚至每分钟都重启。 废话少说,开始定位问题: 1.去掉自动重启功能,在gdb下运行,20多分钟后就崩溃了: 2011-10-26 1... 阅读全文
posted @ 2012-01-09 23:11 dzqabc 阅读(9260) 评论(0) 推荐(0) 编辑
摘要:很多人不是很明白GCC与G++的区别 gcc和g++都是GNU(组织)的一个编译器。 误区一:gcc只能编译c代码,g++只能编译c++代码 两者都可以,但是请注意: 1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的,例如: #include ... 阅读全文
posted @ 2011-12-15 22:06 dzqabc 阅读(427) 评论(0) 推荐(0) 编辑
摘要:使用gdb前需要加编译参数 -g 要调试C/C++的程序,首先在编译时,我们必须要把调试信息源程序信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。如: gcc -g hello.c -o hello g++ -g hello.cpp -o hello 如果没有-... 阅读全文
posted @ 2011-07-12 07:38 dzqabc 阅读(7505) 评论(6) 推荐(0) 编辑
摘要:七、八年前写过一篇《用GDB调试程序》,于是,从那以后,很多朋友在MSN上以及给我发邮件询问我关于GDB的问题,一直到今天,还有人在问GDB的相关问题。这么多年来,有一些问题是大家反复在问的,一方面,我觉得我以前的文章可能没有说清楚,另一方面,我觉得大家常问的问题正是最有用的,所以,在这里罗列出来。希望大家补充。 一、多线程调试 多线程调试可能是问得最多的。其实,重要就是下面几个命令: info ... 阅读全文
posted @ 2011-07-11 07:51 dzqabc 阅读(4187) 评论(0) 推荐(0) 编辑
摘要:线程有自己的寄存器,运行时堆栈或许还会有私有内存。 gdb提供了以下供调试多线程的进程的功能: * 自动通告新线程。 * \ "thread THREADNO\ ",一个用来在线程之间切换的命令。 * \ "info threads\ ",一个用来查询现存线程的命令。 * \ "thread apply [THREADNO] [ALL] ARGS\ ",一个用来向线程提供命令的命令。 * 线程有关的断点设置。 注意:这些特性不是在所有gdb版本都能使用,归根结底要看操作系统是否支持。 如果你的gdb不支持这些命令,会显示出错信息: ( 阅读全文
posted @ 2011-07-09 08:08 dzqabc 阅读(9704) 评论(0) 推荐(0) 编辑
摘要:作者:破砂锅 开源的GDB被广泛使用在Linux、OSX、Unix和各种嵌入式系统(例如手机),这次它又带给我们一个惊喜。 多线程调试之痛 调试器(如VS2008和老版GDB)往往只支持all-stop模式,调试多线程程序时,如果某个线程断在一个断点上,你的调试器会让整个程序 freeze,直到你continue这个线程,程序中的其他线程才会继续运行。这个限制使得被调试的程序不能够像真实环境中那样... 阅读全文
posted @ 2011-07-09 08:05 dzqabc 阅读(8217) 评论(0) 推荐(0) 编辑
摘要:在使用gdb 调试 程序 的时候,有时候需要设定多个断点,重复执行某些操作,而这些操作写起来比较麻烦,这个时候就应该想起来用gdb命令 脚本了,它能够很好的完成这些工作。有两种方式来使用脚本:1)启动gdb时候gdb在启动的时候,会在当前目录 下查找".gdbinit"这个文件作为初始化脚本 ,并把它的内容作为gdb命令进行解释,所以如果我把脚本命名为".gdbinit",这样在启动的时候就会处理这些命令。2)gdb运行期间可以使用 source script-file 来解释gdb命令脚本script-file 阅读全文
posted @ 2011-07-06 00:21 dzqabc 阅读(1144) 评论(0) 推荐(0) 编辑