gdb调试linux可执行程序

2024-04-10 07:58

本文主要是介绍gdb调试linux可执行程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

gdb调试程序例子:

[root@localhost CSwapServer_dist]# gdb CSwapServer

GNU gdb (GDB) Red Hat Enterprise Linux (7.2-83.el6)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/artogrid/workspace/deploy/CSwapServer_dist/CSwapServer...done.
(gdb) l
11 #include "service/send_service.h"
12 #include "service/service_manager.h"
13 #include "service/publish_manager.h"
14 #include "engine/qpid_engine.h"
15 #include "config.h"
16 #include <boost/thread.hpp>
17
18 int main( int argc, char * argv[] )
19 {    
20 engine::qpid::EngineInitializer qpid_engine;
(gdb) 
21
......
58 ServiceManager* service_manager = ServiceManager::singleton();  
59 if (!service_manager->init(conn)) {
60 return -2;
(gdb) b 59
Breakpoint 1 at 0x42d1d7: file main.cpp, line 59.
(gdb) r
Starting program: /home/artogrid/workspace/deploy/CSwapServer_dist/CSwapServer 
[Thread debugging using libthread_db enabled]
2015-11-13 18:14:56,754 [0x7ffff7fdb7a0] INFO  onnectionManager - qpid url: 127.0.0.1
[New Thread 0x7ffff377d700 (LWP 27455)]
[New Thread 0x7ffff2d7c700 (LWP 27456)]
2015-11-13 18:14:56,774 [0x7ffff7fdb7a0] INFO  onnectionManager - qpid url: 127.0.0.1
[New Thread 0x7ffff237b700 (LWP 27457)]
[New Thread 0x7ffff197a700 (LWP 27458)]
2015-11-13 18:14:56,783 [0x7ffff7fdb7a0] INFO  CSwap - Send Service return queue: Queue.CSwap.Main.1
[New Thread 0x7ffff0f79700 (LWP 27459)]
[New Thread 0x7fffe3fff700 (LWP 27460)]
[New Thread 0x7fffe35fe700 (LWP 27461)]


Breakpoint 1, main (argc=1, argv=0x7fffffffe498) at main.cpp:59
59 if (!service_manager->init(conn)) {
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.166.el6_7.3.x86_64 libgcc-4.4.7-16.el6.x86_64 libstdc++-4.4.7-16.el6.x86_64 libuuid-2.17.2-12.18.el6.x86_64 nss-softokn-freebl-3.14.3-23.el6_7.x86_64
(gdb) s
ServiceManager::init (this=0xc1a8e0, conn=0xc042e0) at service_manager.cpp:42
42 if (getService(conn, kServiceLogin) == NULL) {
(gdb) bt
#0  ServiceManager::init (this=0xc1a8e0, conn=0xc042e0) at service_manager.cpp:42
#1  0x000000000042d1ea in main (argc=1, argv=0x7fffffffe498) at main.cpp:59
(gdb) p service_manager
No symbol "service_manager" in current context.
(gdb) p conn
$1 = (sdbus::Connection *) 0xc042e0
(gdb) l
37 return singleton_;
38 }
39
40 bool ServiceManager::init(sdbus::Connection *conn)
41 {
42 if (getService(conn, kServiceLogin) == NULL) {
43 LOGGER_ERROR("create service failed in cswap server: " << kServiceLogin);
44 return false;
45 }
46
(gdb) finish
Run till exit from #0  ServiceManager::init (this=0xc1a8e0, conn=0xc042e0) at service_manager.cpp:42
[New Thread 0x7fffe2bfd700 (LWP 27464)]
[New Thread 0x7fffe21fc700 (LWP 27465)]
[New Thread 0x7fffe17fb700 (LWP 27466)]
[New Thread 0x7fffe0dfa700 (LWP 27467)]
[New Thread 0x7fffc7fff700 (LWP 27468)]
[New Thread 0x7fffc75fe700 (LWP 27469)]
[New Thread 0x7fffc6bfd700 (LWP 27470)]
[New Thread 0x7fffc61fc700 (LWP 27471)]
[New Thread 0x7fffc57fb700 (LWP 27472)]
[New Thread 0x7fffc4dfa700 (LWP 27473)]
2015-11-13 18:15:36,729 [0x7fffe21fc700] INFO  BCBond.Service - Ignore 1 message.
2015-11-13 18:15:36,729 [0x7fffe21fc700] INFO  BCBond.Service - Ignore 2 message.
2015-11-13 18:15:36,730 [0x7fffe21fc700] INFO  BCBond.Service - Ignore 1 message.
2015-11-13 18:15:36,730 [0x7fffe21fc700] INFO  BCBond.Service - Ignore 1 message.
2015-11-13 18:15:36,730 [0x7fffe21fc700] INFO  BCBond.Service - Ignore 1 message.
2015-11-13 18:15:36,730 [0x7fffe21fc700] INFO  BCBond.Service - Ignore 1 message.
[New Thread 0x7fffc43f9700 (LWP 27474)]
[New Thread 0x7fffc39f8700 (LWP 27475)]
0x000000000042d1ea in main (argc=1, argv=0x7fffffffe498) at main.cpp:59
59 if (!service_manager->init(conn)) {
Value returned is $2 = true
(gdb) bt
#0  0x000000000042d1ea in main (argc=1, argv=0x7fffffffe498) at main.cpp:59
(gdb) q
A debugging session is active.


Inferior 1 [process 27452] will be killed.


Quit anyway? (y or n) y

[root@localhost CSwapServer_dist]# 

二. 指令解释

From:http://blog.csdn.net/ghostyu/article/details/8083228

 file [filename]
              装入想要调试的可执行文件

       kill [filename]
              终止正在调试的程序

       break [file:]function
              在(file文件的)function函数中设置一个断点

       clear
              删除一个断点,这个命令需要指定代码行或者函数名作为参数

       run [arglist]
              运行您的程序 (如果指定了arglist,则将arglist作为参数运行程序)

       bt Backtrace: 显示程序堆栈信息

       print expr
              打印表达式的值

       continue
              继续运行您的程序 (在停止之后,比如在一个断点之后)

       list
              列出产生执行文件的源代码的一部分

       next
              单步执行 (在停止之后); 跳过函数调用

       nexti
              执行下一行的源代码中的一条汇编指令

       set
              设置变量的值。例如:set nval=54 将把54保存到nval变量中

       step
              单步执行 (在停止之后); 进入函数调用

       stepi
              继续执行程序下一行源代码中的汇编指令。如果是函数调用,这个命令将进入函数的内部,单步执行函数中的汇编代码

       watch
              使你能监视一个变量的值而不管它何时被改变

       rwatch
              指定一个变量,如果这个变量被读,则暂停程序运行,在调试器中显示信息,并等待下一个调试命令。参考rwatch和watch命令

       awatch
              指定一个变量,如果这个变量被读或者被写,则暂停程序运行,在调试器中显示信息,并等待下一个调试命令。参考rwatch和watch命令

       Ctrl-C
              在当前位置停止执行正在执行的程序,断点在当前行

       disable
              禁止断点功能,这个命令需要禁止的断点在断点列表索引值作为参数

       display
              在断点的停止的地方,显示指定的表达式的值。(显示变量)

       undisplay
              删除一个display设置的变量显示。这个命令需要将display list中的索引做参数

       enable
              允许断点功能,这个命令需要允许的断点在断点列表索引值作为参数

       finish
              继续执行,直到当前函数返回

       ignore
              忽略某个断点制定的次数。例:ignore 4 23 忽略断点4的23次运行,在第24次的时候中断

       info [name]
              查看name信息

       load
              动态载入一个可执行文件到调试器

       xbreak
              在当前函数的退出的点上设置一个断点

       whatis
              显示变量的值和类型

       ptype
              显示变量的类型

       return
              强制从当前函数返回

       txbreak
              在当前函数的退出的点上设置一个临时的断点(只可使用一次)

       make
              使你能不退出 gdb 就可以重新产生可执行文件

       shell
              使你能不离开 gdb 就执行 UNIX shell 命令

       help [name]
              显示GDB命令的信息,或者显示如何使用GDB的总体信息

       quit
              退出gdb.


这篇关于gdb调试linux可执行程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/890484

相关文章

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法

《ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法》本文介绍了Elasticsearch的基本概念,包括文档和字段、索引和映射,还详细描述了如何通过Docker... 目录1、ElasticSearch概念2、ElasticSearch、Kibana和IK分词器部署

Linux流媒体服务器部署流程

《Linux流媒体服务器部署流程》文章详细介绍了流媒体服务器的部署步骤,包括更新系统、安装依赖组件、编译安装Nginx和RTMP模块、配置Nginx和FFmpeg,以及测试流媒体服务器的搭建... 目录流媒体服务器部署部署安装1.更新系统2.安装依赖组件3.解压4.编译安装(添加RTMP和openssl模块

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

Linux环境变量&&进程地址空间详解

《Linux环境变量&&进程地址空间详解》本文介绍了Linux环境变量、命令行参数、进程地址空间以及Linux内核进程调度队列的相关知识,环境变量是系统运行环境的参数,命令行参数用于传递给程序的参数,... 目录一、初步认识环境变量1.1常见的环境变量1.2环境变量的基本概念二、命令行参数2.1通过命令编程

Linux之进程状态&&进程优先级详解

《Linux之进程状态&&进程优先级详解》文章介绍了操作系统中进程的状态,包括运行状态、阻塞状态和挂起状态,并详细解释了Linux下进程的具体状态及其管理,此外,文章还讨论了进程的优先级、查看和修改进... 目录一、操作系统的进程状态1.1运行状态1.2阻塞状态1.3挂起二、linux下具体的状态三、进程的

Linux编译器--gcc/g++使用方式

《Linux编译器--gcc/g++使用方式》文章主要介绍了C/C++程序的编译过程,包括预编译、编译、汇编和链接四个阶段,并详细解释了每个阶段的作用和具体操作,同时,还介绍了调试和发布版本的概念... 目录一、预编译指令1.1预处理功能1.2指令1.3问题扩展二、编译(生成汇编)三、汇编(生成二进制机器语

Rsnapshot怎么用? 基于Rsync的强大Linux备份工具使用指南

《Rsnapshot怎么用?基于Rsync的强大Linux备份工具使用指南》Rsnapshot不仅可以备份本地文件,还能通过SSH备份远程文件,接下来详细介绍如何安装、配置和使用Rsnaps... Rsnapshot 是一款开源的文件系统快照工具。它结合了 Rsync 和 SSH 的能力,可以帮助你在 li

使用C/C++调用libcurl调试消息的方式

《使用C/C++调用libcurl调试消息的方式》在使用C/C++调用libcurl进行HTTP请求时,有时我们需要查看请求的/应答消息的内容(包括请求头和请求体)以方便调试,libcurl提供了多种... 目录1. libcurl 调试工具简介2. 输出请求消息使用 CURLOPT_VERBOSE使用 C