随笔分类 -  linux下程序的编译及调试

记录遇到的编译问题; 编译器特征; 常用调试工具的使用;
摘要:--------------------------------------------------------------- ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。 ASSERT只有在Debug版本中才有效,如果编译为Release版本则被忽略。 -----------------------------------------------... 阅读全文
posted @ 2012-01-02 20:01 夏大王 阅读(396) 评论(0) 推荐(0)
摘要:UNIX 家族总是为用户提供了丰富的工具。UNIX 是一个工具财宝箱,有了这些工具,您不仅可以完成具有创造性的工作,还可以在深入研究该操作系统的同时得到教育和娱乐。strace(用来跟踪任何程序的系统调用)和 GDB 调试工具(用来在受控的环境中运行程序的功能齐全的调试工具)是实现这个目标的两个有价值的工具。UNIX 的设计由大量的函数调用(称为系统调用)组成,其中包括一些简单的任务,如在屏幕上显示字符串来设置任务优先级。所有的 UNIX 程序都是通过调用操作系统提供的这些底层服务来完成它们的任务,使用 strace 工具,您可以清楚地看到这些调用过程及其使用的参数。通过这种方式,您可以操作这 阅读全文
posted @ 2011-12-12 11:00 夏大王 阅读(397) 评论(0) 推荐(0)
摘要:本文详细讲述linux下的strace命令的用法。strace 命令是一种强大的工具,它能够显示所有由用户空间程序发出的系统调用。 strace 显示这些调用的参数并返回符号形式的值。strace 从内核接收信息,而且不需要以任何特殊的方式来构建内核。 下面记录几个常用 option . 1 -f -F选项告诉strace同时跟踪fork和vfork出来的进程 2 -o xxx.txt 输出到某个文件。 3 -e execve 只记录 execve 这类系统调用 ————————————————— 进程无法启动,软件运行速度突然变慢,程序的”SegmentFault... 阅读全文
posted @ 2011-12-12 10:56 夏大王 阅读(1094) 评论(0) 推荐(0)
摘要:用GDB调试程序(10)──查看运行时数据(1)在你调试程序时,当程序被停住时,你可以使用print命令(简写命令为p),或是同义命令inspect来查看当前程序的运行数据。print命令的格式是: print <expr> print /<f> <expr><expr>是表达式,是你所调试的程序的语言的表达式(GDB可以调试多种编程语言),<f>是输出的格式,比如,如果要把表达式按16进制的格式输出,那么就是/x。 一、表达式print和许多GDB的命令一样,可以接受一个表达式,GDB会根据当前的程序运行的数据来计算这个表达式,既然 阅读全文
posted @ 2011-12-10 19:21 夏大王 阅读(445) 评论(0) 推荐(0)
摘要:Valgrind 使用简单说明--检查内存泄露调不尽的内存泄露,用不完的Valgrind(一个介绍程序调试的精彩讲解:http://www.ibm.com/developerworks/cn/linux/l-pow-debug/)Valgrind 介绍 Valgrind是一个GPL的软件,用于Linux(For x86, amd64 and ppc32)程序的内存调试和代码剖析。你可以在它的环境中运行你的程序来监视内存的使用情况,比如C 语言中的malloc和free或者 C++中的new和 delete。使用Valgrind的工具包,你可以自动的检测许多内存管理和线程的bug,避免花费太多的 阅读全文
posted @ 2011-12-09 15:32 夏大王 阅读(689) 评论(0) 推荐(0)
摘要:应用 Valgrind 发现 Linux 程序的内存问题杨 经 (cdlyangj@cn.ibm.com), 软件工程师, IBM杨经,他的技术兴趣包括自动化测试与linux系统管理。目前是IBM中国系统与技术实验室(CSTL)的软件工程师,从事中小型企业(SME)服务器的测试工作,可以通过cdlyangj@cn.ibm.com与他联系。简介:如何定位应用程序开发中的内存问题,一直是 inux 应用程序开发中的瓶颈所在。有一款非常优秀的 linux 下开源的内存问题检测工具:valgrind,能够极大的帮助你解决上述问题。掌握 valgrind 的使用以及工作原理,能够有效地定位进而避免应用开 阅读全文
posted @ 2011-12-09 15:29 夏大王 阅读(331) 评论(0) 推荐(0)
摘要:如果调用栈在__lll_mutex_lock_wait, 基本上可以说是死锁了。如果有__lll_mutex_lock_wait () from /lib/tls/libc.so.6 并且 _L_mutex_lock_2507 , 可以断定内存出现问题了。可能是某个类已经释放了,还是用那个类的锁导致的。如果出现 __lll_mutex_lock_wait () from /lib/tls/libpthread.so.0 并且L_mutex_lock_35 (),可能是死锁了。1) 如果是内存错误,可以使用valgrind检查。2) 如果是死锁,可以使用pstack 或者 gdb的情况下使用 t 阅读全文
posted @ 2011-12-09 15:28 夏大王 阅读(1046) 评论(0) 推荐(0)
摘要:一、多线程调试 多线程调试可能是问得最多的。其实,重要就是下面几个命令:info thread 查看当前进程的线程。 thread <ID> 切换调试的线程为指定ID的线程。 break file.c:100 thread all 在file.c文件第100行处为所有经过这里的线程设置断点。 set scheduler-locking off|on|step,这个是问得最多的。在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,怎么只让被调试程序执行呢?通过这个命令就可以实现这个需求。 off 不锁定任何线程,也就是所有线程都执行,这是默认值。 阅读全文
posted @ 2011-12-08 19:17 夏大王 阅读(628) 评论(0) 推荐(0)
摘要:在Unix系统下,应用程序崩溃,一般会产生core文件,如何根据core文件查找问题的所在,并做相应的分析和调试,是非常重要的。什么是Core Dump?Core的意思是内存, Dump的意思是扔出来, 堆出来.开发和使用Unix程序时, 有时程序莫名其妙的down了, 却没有任何的提示(有时候会提示core dumped). 这时候可以查看一下有没有形如core.进程号的文件生成, 这个文件便是操作系统把程序down掉时的内存内容扔出来生成的, 它可以做为调试程序的参考.core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个c 阅读全文
posted @ 2011-12-08 16:33 夏大王 阅读(410) 评论(0) 推荐(0)
摘要:#[reporter]debugin@playmp3_by_list!#[reporter]reporter_event_pth ##cmd_data.my_msg_type=1!#[reporter]RUN_INFO: START station 6*** glibc detected *** double free or corruption (out): 0x0000000000515d20 ***#[reporter]SignalHander(signal:6)(pid:19025)#[reporter]SignalHander(signal:6)(pid:19025)#[report 阅读全文
posted @ 2011-12-08 16:14 夏大王 阅读(2003) 评论(0) 推荐(0)
摘要:查看错误代码errno是调试程序的一个重要方法。当linuc C api函数发生异常时,一般会将errno变量(需include errno.h)赋一个整数值,不同的值表示不同的含义,可以通过查看该值推测出错的原因。在实际编程中用这一招解决了不少原本看来莫名其妙的问题。比较麻烦的是每次都要去linux源代码里面查找错误代码的含义,现在把它贴出来,以后需要查时就来这里看了。以下来自linux 2.4.20-18的内核代码中的/usr/include/asm/errno.h#ifndef _I386_ERRNO_H#define _I386_ERRNO_H#define EPERM 1 /* O. 阅读全文
posted @ 2011-12-08 11:45 夏大王 阅读(201) 评论(0) 推荐(0)
摘要:使用C/C++语言开发程序时,当程序crash的时候产生coredump文件对于调试程序是很有帮助的。在RedhatLinux系统中默认是不生成coredump文件的,这是因为在/etc/profile文件中有这样一行ulimit-S-c0>/dev/null2>&1如何打开coredump呢?最简单的方法是用户在自己的~/.bash_profile中加入ulimit-S-cunlimited>/dev/null2>&1,这样设置后允许当前用户生成没有大小限制的coredump文件。此外还有两种系统级修改生成coredump的方法。第一种方法是修改/et 阅读全文
posted @ 2011-12-06 18:59 夏大王 阅读(1338) 评论(0) 推荐(0)
摘要:抓内存错误时,挂gdb运行程序,总是碰到Program received signal SIG32, Real-time event 32.的问题,程序总是被挂起,然后就需要不停的c(continue),很麻烦 解决方法:在进入gdb之后,运行程序之前,输入handle SIG32 nostop命令,可以让程序接收到sig32信号时,不挂起*** glibc detected *** ./server: double free or corruption (!prev): 0x08a03b88 ***http://topic.csdn.net/u/20090812/15/43cae1c5-9. 阅读全文
posted @ 2011-12-06 18:56 夏大王 阅读(4482) 评论(0) 推荐(0)
摘要:errno.h- - 查看错误代码errno是调试程序的一个重要方法。当linuc C api函数发生异常时,一般会将errno变量(需include errno.h)赋一个整数值,不同的值表示不同的含义,可以通过查看该值推测出错的原因。在实际编程中用这一招解决了不少原本看来莫名其妙的问题。比较麻烦的是每次都要去linux源代码里面查找错误代码的含义,现在把它贴出来,以后需要查时就来这里看了。以下来自linux 2.4.20-18的内核代码中的/usr/include/asm/errno.h#ifndef _I386_ERRNO_H#define _I386_ERRNO_H#define EP 阅读全文
posted @ 2011-11-18 18:46 夏大王 阅读(220) 评论(0) 推荐(0)
摘要:strace命令用法调用: strace [ -dffhiqrtttTvxx ] [ -acolumn ] [ -eexpr ] ... [ -ofile ] [ -ppid ] ... [ -sstrsize ] [ -uusername ] [ command [ arg ... ] ] strace -c [ -eexpr ] ... [ -Ooverhead ] [ -Ssortby ] [ command [ arg ... ] ] 功能: 跟踪程式执行时的系统调用和所接收的信号.通常的用法是strace执行一直到commande结束. 并且将所调用的系统调用的名称、参数和返回值输出 阅读全文
posted @ 2011-09-15 18:30 夏大王 阅读(376) 评论(0) 推荐(0)
摘要:strace工具是一个非常强大的工具,是调试程序的好工具。要移植到arm平台,就需要使用交叉编译工具编译生成静态链接的可执行文件。具体步骤如下:1.下载 strace-4.5.16.tar.bz2,下载网址是:http://www.filewatcher.com/m/strace-4.5.16.tar.bz2.457272.0.0.html2.解压。3.配置。./configure --host=arm-none-linux-gnueabi CC=arm-none-linux-gnueabi-gcc4.编译。make CFLAGS+="-static",生成strace静态 阅读全文
posted @ 2011-05-05 19:29 夏大王 阅读(2124) 评论(0) 推荐(0)