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

相关文章

Oracle数据库定时备份脚本方式(Linux)

《Oracle数据库定时备份脚本方式(Linux)》文章介绍Oracle数据库自动备份方案,包含主机备份传输与备机解压导入流程,强调需提前全量删除原库数据避免报错,并需配置无密传输、定时任务及验证脚本... 目录说明主机脚本备机上自动导库脚本整个自动备份oracle数据库的过程(建议全程用root用户)总结

Linux如何查看文件权限的命令

《Linux如何查看文件权限的命令》Linux中使用ls-R命令递归查看指定目录及子目录下所有文件和文件夹的权限信息,以列表形式展示权限位、所有者、组等详细内容... 目录linux China编程查看文件权限命令输出结果示例这里是查看tomcat文件夹总结Linux 查看文件权限命令ls -l 文件或文件夹

idea的终端(Terminal)cmd的命令换成linux的命令详解

《idea的终端(Terminal)cmd的命令换成linux的命令详解》本文介绍IDEA配置Git的步骤:安装Git、修改终端设置并重启IDEA,强调顺序,作为个人经验分享,希望提供参考并支持脚本之... 目录一编程、设置前二、前置条件三、android设置四、设置后总结一、php设置前二、前置条件

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

Linux系统之lvcreate命令使用解读

《Linux系统之lvcreate命令使用解读》lvcreate是LVM中创建逻辑卷的核心命令,支持线性、条带化、RAID、镜像、快照、瘦池和缓存池等多种类型,实现灵活存储资源管理,需注意空间分配、R... 目录lvcreate命令详解一、命令概述二、语法格式三、核心功能四、选项详解五、使用示例1. 创建逻

Linux下在线安装启动VNC教程

《Linux下在线安装启动VNC教程》本文指导在CentOS7上在线安装VNC,包含安装、配置密码、启动/停止、清理重启步骤及注意事项,强调需安装VNC桌面以避免黑屏,并解决端口冲突和目录权限问题... 目录描述安装VNC安装 VNC 桌面可能遇到的问题总结描js述linux中的VNC就类似于Window

linux下shell脚本启动jar包实现过程

《linux下shell脚本启动jar包实现过程》确保APP_NAME和LOG_FILE位于目录内,首次启动前需手动创建log文件夹,否则报错,此为个人经验,供参考,欢迎支持脚本之家... 目录linux下shell脚本启动jar包样例1样例2总结linux下shell脚本启动jar包样例1#!/bin

在IntelliJ IDEA中高效运行与调试Spring Boot项目的实战步骤

《在IntelliJIDEA中高效运行与调试SpringBoot项目的实战步骤》本章详解SpringBoot项目导入IntelliJIDEA的流程,教授运行与调试技巧,包括断点设置与变量查看,奠定... 目录引言:为良驹配上好鞍一、为何选择IntelliJ IDEA?二、实战:导入并运行你的第一个项目步骤1

Linux之platform平台设备驱动详解

《Linux之platform平台设备驱动详解》Linux设备驱动模型中,Platform总线作为虚拟总线统一管理无物理总线依赖的嵌入式设备,通过platform_driver和platform_de... 目录platform驱动注册platform设备注册设备树Platform驱动和设备的关系总结在 l

linux批量替换文件内容的实现方式

《linux批量替换文件内容的实现方式》本文总结了Linux中批量替换文件内容的几种方法,包括使用sed替换文件夹内所有文件、单个文件内容及逐行字符串,强调使用反引号和绝对路径,并分享个人经验供参考... 目录一、linux批量替换文件内容 二、替换文件内所有匹配的字符串 三、替换每一行中全部str1为st