工作和面试中的gdb

gdb是C/C++程序员必备的专业技能,工作中gdb最常用的场景有两个,一个是分析core文件,另一个是调试程序。

分析core文件的方法如下:

1、gdb 程序名 core文件名

2、bt或where命令查看堆栈信息。

3、进入某个栈:f N,f是frame的缩写,N是栈号,如0、1、2、3...

进入到某个栈后,才能通过p命令查看这个栈的临时变量,否则只能查看全局变量。

例如a.out程序core产生了core文件core-a.out-12345,gdb方法如下:

gdb a.out core-a.out-12345

bt(或者where)

f 3,进入第3帧

调试一个正在运行的程序使用gdb -p PID命令,PID即程序的pid。

需要注意的是,gdb调试正在运行的程序会导致程序挂起,因此请记住不要gdb调试正在运行的在线服务。

设置断点的方式有很多种,最常见的有两种:一是设置程序运行到源代码的某一行,二是设置程序运行到某个函数。

设置程序运行到某一行,通过“文件名:行号”的形式:

b test.cpp:100

设置程序运行到某个函数,通过“名字空间::函数名”的形式:

gdb namespace_a::func

查看断点:info b

删除断点:d N,d是delete的缩写,N是断点的编号,可以通过info b查看。

无论哪种方式设置断点,都要执行c命令(continue),让程序继续运行。

在调试程序时,最常用的gdb命令是:n、s、p

n即next,单步执行,执行下一步的意思,遇到函数会调用函数。

s即step,也是单步执行,但是会进入函数内部,然后结合n命令来调试函数。

p即print,打印变量,最常用的命令。p可以打印普通变量、std::string字符串、指针、数组等。

gdb打印字符串支持c_str()、length()等:

std::string str;

p str,p str.c_str()查看字符串内容,p str.length(),查看字符串长度

有时会遇到字符串太长不能显示全,最后显示"...",可以通过命令取消长度限制:

set print elements 0

这样就能打印完整的字符串。

小提示:

1、gdb会自动保存上一次执行的命令,可以通过键盘的上下方向箭头切换最近输入的命令。

2、直接敲回车,会执行上一次的命令,在n单步调试的时候最常用。

面试中的gdb问题往往会很挑剔,除了考察常用的gdb命令,还会问一些多线程相关的命令,

例如怎么查看线程信息?怎么打印所有线程的当前栈信息?

gdb查看线程信息:info thread,可以查看线程编号和正在执行的函数

进入某个线程:t N,N是线程编号,如1、2、3...

查看所有线程的栈信息:thread apply all bt

这是面试官在考察面试者有没有多线程问题排查经验。

最后说一下gdb中如何打印STL的vector和map,gdb默认不支持STL,

需要从网上下载一个txt文件,然后将其内容追加到.gdbinit文件中,就可以使用pvector命令查看vector容器数据。



金句分享

有很多好书对我的行为和信念产生了巨大影响。我尝试着每天花一些时间去读一本书或者听一本有声书,这些书会以某种方式改善我的生活。

出自《软技能 代码之外的生存指南》,“我的私房成功书单”章节。

解读:读书是对自己最好的投资,多读一些专业书、理财书、励志书。

原文地址:https://www.cnblogs.com/zgwu/p/10588928.html

时间: 2024-07-29 19:35:24

工作和面试中的gdb的相关文章

工作和面试中的单例

单例是什么?单例是一种特殊的类,用于确保只有一个对象,同时提供一种全局访问这个对象的方法.最近在工作中体验了一把5分钟将一个类改造成单例,感觉还是蛮不错的,所以我决定写一篇文章,跟大家交流技术和经验. 单例的原理是利用C++中的静态成员变量和静态成员函数,同时禁用构造函数的方法,达到只有一个对象实例的目的. 具体来说,设计一个单例的要点如下: (1)类的静态成员变量是该类的指针. (2)类的静态成员函数负责返回唯一的实例,当(1)中的指针不为空时就直接返回,否则为该指针new一个对象. (3)类

程序员如何快速准备面试中的算法

前言 我决定写篇短文,即为此文.之所以要写这篇文章,缘于微博上常有朋友询问,要毕业找工作了,如何备战算法.尽管在微博上简单梳理过,如下图所示: 但因字数限制,特撰此文着重阐述下:程序员如何快速准备面试中的算法,顺便推荐一些相关的书籍或资料. 备战面试中算法的五个步骤 总体来说,备战面试中的算法,分为五个步骤,如下: 1.首选你得确保自己已经掌握好一门编程语言 如果是C的话,推荐Dennis M. Ritchie & Brian W. Kernighan著的<C程序设计语言>,和<

前端面试中的常见的算法问题

虽说我们很多时候前端很少有机会接触到算法.大多都交互性的操作,然而从各大公司面试来看,算法依旧是考察的一方面.实际上学习数据结构与算法对于工程师去理解和分析问题都是有帮助的.如果将来当我们面对较为复杂的问题,这些基础知识的积累可以帮助我们更好的优化解决思路.下面罗列在前端面试中经常撞见的几个问题吧. Q1 判断一个单词是否是回文? 回文是指把相同的词汇或句子,在下文中调换位置或颠倒过来,产生首尾回环的情趣,叫做回文,也叫回环.比如 mamam redivider . 很多人拿到这样的题目非常容易

面试中的排序算法总结(转)

转自http://www.codeceo.com/article/10-sort-algorithm-interview.html 前言 查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中.因为其实现代码较短,应用较常见.所以在面试中经常会问到排序算法及其相关的问题.但万变不离其宗,只要熟悉了思想,灵活运用也不是难事.一般在面试中最常考的是快速排序和归并排序,并且经常有面试官要求现场写出这两种排序的代码.对这两种排序的代码一定要信手拈来才行.还有插入排序.冒泡排序.堆排序.基数排序.

面试中关于Java你所需知道的的一切

本篇文章会对面试中常遇到的Java技术点进行全面深入的总结,帮助我们在面试中更加得心应手,不参加面试的同学也能够借此机会梳理一下自己的知识体系,进行查漏补缺. 1. Java中的原始数据类型都有哪些,它们的大小及对应的封装类是什么? (1)boolean boolean数据类型非true即false.这个数据类型表示1 bit的信息,但是它的大小并没有精确定义. <Java虚拟机规范>中如是说:“虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持.在Java虚拟机中没有任何供

面试中关于Java中涉及到知识点(转)

本篇文章会对面试中常遇到的Java技术点进行全面深入的总结,帮助我们在面试中更加得心应手,不参加面试的同学也能够借此机会梳理一下自己的知识体系,进行查漏补缺. 1. Java中的原始数据类型都有哪些,它们的大小及对应的封装类是什么? (1)boolean boolean数据类型非true即false.这个数据类型表示1 bit的信息,但是它的大小并没有精确定义. <Java虚拟机规范>中如是说:“虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持.在Java虚拟机中没有任何供

vi/vim使用进阶: 在VIM中使用GDB调试 – 使用vimgdb

vi/vim使用进阶: 在VIM中使用GDB调试 – 使用vimgdb << 返回vim使用进阶: 目录 本节所用命令的帮助入口: :help vimgdb 在UNIX系统最初设计时,有一个非常重要的思想:每个程序只实现单一的功能,通过管道等方式把多个程序连接起来,使之协同工作,以完成更强大的功能.程序只实现单一功能,一方面降低了程序的复杂性,另一方面,也让它专注于这一功能,把这个功能做到最好.就好像搭积木一样,每个积木只提供简单的功能,但不同的积木垒在一起,就能搭出大厦.汽车等等复杂的东西.

面试中的排序算法总结

来源:http://www.cnblogs.com/wxisme/p/5243631.html 前言 查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中.因为其实现代码较短,应用较常见.所以在面试中经常会问到排序算法及其相关的问题.但万变不离其宗,只要熟悉了思想,灵活运用也不是难事.一般在面试中最常考的是快速排序和归并排序,并且经常有面试官要求现场写出这两种排序的代码.对这两种排序的代码一定要信手拈来才行.还有插入排序.冒泡排序.堆排序.基数排序.桶排序等.面试官对于这些排序可能会要

程序员如何快速准备面试中的算法 - 结构之法

准备面试.学习算法,特别推荐最新出版的我的新书<编程之法:面试和算法心得>,已经上架京东等各大网店 前言 我决定写篇短文,即为此文.之所以要写这篇文章,缘于微博上常有朋友询问,要毕业找工作了,如何备战算法.尽管在微博上简单梳理过,如下图所示: 但因字数限制,许多问题无法一次性说清楚,故特撰此文着重阐述下:程序员如何快速准备面试中的算法,继而推荐一些相关的书籍或资料.顺便也供节后跳槽.3月春季招聘小高潮.及6月毕业找工作的朋友参考. 备战面试中算法的五个步骤 对于立志进一线互联网公司,同时不满足