存档

文章标签 ‘gdb’

手把手教你玩转GDB(2)—在GDB中玩转STL(ppt)

2011年10月1日 19 条评论

上周给team成员分享的—-GDB系列第二弹—-主要内容是分析STL中常用容器的结构,教大家如何在GDB中玩转STL,让STL的调试不再头疼。如果对GDB不是很熟的朋友,我之前推出过一系列的GDB相关的文章,可以先看一下之前的文章,然后再看这个会轻松一些。之前的GDB系列文章参见下面的“相关文章”列表。下面是flash版的PPT,大家可以先堵为快:

Get Adobe Flash player


如果觉得flasht版不够给力的朋友,可以在下面留言,向我索取原始的ppt版本,记得留下邮箱地址。或者到新浪微博,收听小武哥博客(http://weibo.com/zeshengwu),然后给我发私信索取,谢谢!

手把手教你调试STL容器(下)

2011年5月16日 1 条评论

本文是《手把手教你调试STL容器》系列的下篇,阅读本文之前,请先阅读上篇《手把手教你调试STL容器(上)》。上篇中主要介绍了STL中string, vector, list, deque这些基本的容器。本篇将介绍由红黑树实现的map/set/multimap/multiset这些容器,以及由hashtable实现的hash_map/hash_set/hash_multimap/hash_multiset这些容器。

  • 1. 红黑树(Red black tree)
  • 我们知道, STL中的map/set/multimap/multiset,都是由红黑树实现的,因此我们要了解map/set/multimap/multiset这些容器是如何实现的,就首先要了解红黑树的基本组成: 阅读全文…

    手把手教你调试STL容器(上)

    2011年5月3日 3 条评论

    众所周知,调试(Debugging)是每个程序员所要必备的基本的技术素养,尤其是对C/C++的程序员来说。对于在linux下用C/C++开发的朋友,相信对GDB不会陌生,当程序有bug或者是出现core dump的时候,GDB是我们最好的朋友。STL是C++相较于C而言,增加的非常强有力的工具,它从某种程度上把C/C++程序员从繁琐的基本数据结构中解放了出来。不过,STL虽然用起来十分方便,但是,用GDB调试过C/C++程序的朋友都有这样痛苦的经历,在GDB状态下,要知道某个STL对象(比如容器)中的数据内容,并不是那么直接、简单。本文的主要内容就是介绍STL中大家比较常用到的容器的基本组成,帮助大家能够在调试的时候更好的驾驭它们。

  • 1. string
  • string是STL中最为常用的类型,它是模板类basic_string用char类型特化后的结果,下面我们来看一下string类型的基本组成: 阅读全文…

    linux程序分析工具介绍(一)—-“/proc”

    2011年1月4日 7 条评论

    写在最前面:在开始本文之前,笔者认为先有必要介绍一下linux下的man,如果读者手头用linux系统,直接在终端输入man man便可以看到详细的说明,我在这里简单的总结一下,man命令是用来查看linux下各种命令、工具等的用户手册(manual)的。一种比较常用的用法是”man n field”,这里的n是要查找的手册了类型,field是关键字。在这里介绍一下n:

  • 0 /usr/include下的头文件
  • 1 可执行程序和shell命令
  • 2 系统调用
  • 3 系统库函数
  • 4 /dev下的特殊文件
  • 5 文件格式和约定(比如/etc/passwd)
  • 阅读全文…

    分类: 技术杂记 标签: , , , , ,

    手把手教你玩转GDB(ppt)

    2010年11月17日 27 条评论

    前几天给小组成员分享GDB使用的ppt新鲜出炉啦,希望对需要的朋友有所帮助~~ 另外,ppt转成flash之后,发现动画效果都没了,如果觉得这个不够给力的朋友,可以在下面给小武哥留言索求.ppt版本的内容,或者可以到腾讯微博上收听小武哥,向小武哥索取,小武哥的腾讯微博:http://t.qq.com/wuzesheng,下面是flash版的ppt: 阅读全文…

    分类: 程序人生 标签: ,

    手把手教你玩转GDB(四)——–函数调用栈(call stack)探密

    2010年9月23日 10 条评论

    本文是GDB系列的第四篇,感兴趣的朋友可以阅读本系列的前三篇。本文的主要内容是讲如何用GDB来查看C/C++程序中函数调用栈(call stack)的相关信息,通过介绍一些相关的命令及其用法,让读者朋友能够循序渐进了解调用栈的各个方面,更好的驾驭程序。下面开始今天的内容。

    我们知道,通常一个程序的运行,不外乎是A函数调用B,B函数调用C等等,等所有的调用都完成后,整个程序的运行也就ok了。在这个过程中,每当有新的函数调用,系统都会把该函数的一些信息,包括函数的参数,以及一些寄存器的值等,保存到调用栈(call stack)上。等该函数运行完成后,这些信息再从调用栈上弹出(pop)。如下图所示,是一个完整的调用栈:

    在上图中,整体叫做调用栈(call stack),每一行叫做一桢(frame)。我们来看看桢信息的组成有哪些: 阅读全文…

    手把手教你玩转GDB(三)——常用命令

    2010年8月30日 9 条评论

    本文是手把手教你玩转GDB的第三篇,主要内容是介绍一些在程序调试过程中最常用的GDB命令,废话不多话,开始今天的正题。
    1.attach process-id/detach

  • (1)attach process-id: 在GDB状态下,开始调试一个正在运行的进程,其进程ID为process-id
  • (2)detach: 停止调试当前正在调试有进程,与attach配对试用
  • 2.kill

  • (1)基本功能:杀掉当前GDB正在调试的应用程序所对应的子进程
  • (2)如果想不退出GDB而对当前正在调试的应用程序重新编译、链接,可以在GDB中执行kill杀掉子进程,等编译、链接完后,再重新执行run,GDB便可加载新的可执行程序启动调试
  • 3.多线程程序调试相关:

  • (1)thread threadno:切换当前线程到由threadno指定的线程
  • (2)info threads:查看GDB当前调试的程序的各个线程的相关信息
  • (3)thread apply [threadno] [all] args:对指定(或所有)的线程执行由args指定的命令
  • 4.多进程程序调试相关(fork/vfork): 阅读全文…

    手把手教你玩转GDB(二)——Breakpoint, Watchpoint和Catchpoint

    2010年8月22日 5 条评论

    本文是《手把手教你玩转GDB》系列的第二篇,主要内容是用GDB调试程序中比较常用到的断点(breakpoint)、监视点(watchpoint)和捕捉点(catchpoint)。虽然说这三类point的功能是不一样的,但它们的用法却极为相似。因此,本文将以断breakpoint为例,进行详细的介绍,关于watchpoint和catchpoint的介绍就相对比较粗略,相信读者朋友如果能够理解breakpoint的部分,那么便可以触类旁通,学会watchpoint和catchpoint的用法。

    1. Breakpoint: 作用是让程序执行到某个特定的地方停止运行

  • (1)设置breakpoint:
  • a. break function: 在函数funtion入口处设置breakpoint
    b. break +offset: 在程序当前停止的行向前offset行处设置breakpoint
    c. break offset: 在程序当前停止的行向衙offset行处设置breakpoint
    d. break linenum: 在当前源文件的第linenum行处设置breakpoint
    e. break filename:linenum: 在名为filename的源文件的第linenum行处设置breakpoint 阅读全文…

    手把手教你玩转GDB(一)——牛刀小试:启动GDB开始调试

    2010年7月24日 2 条评论

    写在最前面:GDB是unix相关操作系统中C/C++程序开发必不可少的工具,它的功能之强大,是其它调试器所不能匹敌的。但是,现实的工作中,有很多开发者因为GDB本身入门门槛比较高,而被拒之门,与如此强大的失之交臂。笔者在近两年的C/C++开发工作中,对GDB本身的有一点研究,在这里总结出一系列《手把手教你玩转GDB》的文章,一方面权当是对自己经验的一个总结,一方面也是真的想能够对刚接触GDB的开发者朋友带去一些帮助,让更多的人来使用如此强大的工具。今天推出第一篇:

    第一部分 牛刀小试:启动GDB开始调试

    1. 启动GDB开始调试:

    (1)gdb program ///最常用的用gdb启动程序,开始调试的方式
    (2)gdb program core ///用gdb查看core dump文件,跟踪程序core的原因
    (3)gdb program pid ///用gdb调试已经开始运行的程序,指定pid即可 阅读全文…

    C/C++程序在GDB调试状态时的信号响应

    2010年6月8日 8 条评论

    相信用GDB调试过程序的朋友都知道,C/C++程序在GDB调试状态是不能直接响应外部信号的。比如,你正在用GDB运行一个程序,然后,你按了Ctrl+C,GDB收到SIGINT信号,程序本身并不会收到这个信号。那么,倒底如何让GDB把信号传递给应用程序本身呢?且听我一一道来。

    GDB中有一个handle命令,可以指定如何处理收到信号,GDB支持的对信号的处理主要有以下几种: 阅读全文…

    分类: 程序人生 标签: , , , ,

    介绍几个关于C/C++程序调试的函数

    2010年5月6日 13 条评论

    最近调试程序学到的几个挺有用的函数,分享一下,希望对用C/C++的朋友有所帮助!

    1. 调用栈系列
    下面是函数原型:

    1
    2
    3
    4
    
    #include "execinfo .h"
    int backtrace(void **buffer, int size);
    char **backtrace_symbols(void *const *buffer, int size);
    void backtrace_symbols_fd(void *const *buffer, int size, int fd);

    接下来,对上面三个函数进行介绍:
    (1)backtrace用来获得当前程序的调用栈,把结果存在buffer中。通常,我们用gdb调试程序,设置合适的断点,停下来之后,用backtrace(bt)命令,就可以看到当前的调用栈。但是,有的时候,用到条件断点的时候,gdb的功能就没有程序本身的强大了,这个时候,可以考虑在程序中调用backtrace函数,来获取调用栈。
    (2)backtrace_symbols把用backtrace获取的调用栈转换成字符串数组,以字符串数组的形式返回,使用者需要在外面释放返回的字符串数组所占用的内存
    (3)backtrace_symbols_fd把用backtrace获取的调用栈信息写到fd所指定的文件中 阅读全文…

    分类: 程序人生 标签: , , , , ,

    C++结构类型在GDB中的强制类型转换

    2010年3月12日 没有评论

    今天在调试程序的过程中遇到的一个小问题,在这里记录一下,希望能对遇到同样问题的朋友有所帮助。 阅读全文…

    由SIGPIPE导致程序退出想到的

    2009年7月24日 没有评论

    这几天在写一个发送快照的客户端,写好后测试。刚开始,启动服务端,客户端启动,开始发送快照页面。观察数据,结果,一切正常。基本功能实现了。今天早上,想到如果服务端关闭,客户端的状态会怎么样呢?产生了这个想法,就马上来try一下,结果客户端程序直接退出了,也没有产生core dump文件。很诡异! 于是gdb之,发现是产生了信号SIGPIPE,恩这下明白了。 阅读全文…