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脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

详解Linux中常见环境变量的特点与设置

《详解Linux中常见环境变量的特点与设置》环境变量是操作系统和用户设置的一些动态键值对,为运行的程序提供配置信息,理解环境变量对于系统管理、软件开发都很重要,下面小编就为大家详细介绍一下吧... 目录前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变

Linux系统中的firewall-offline-cmd详解(收藏版)

《Linux系统中的firewall-offline-cmd详解(收藏版)》firewall-offline-cmd是firewalld的一个命令行工具,专门设计用于在没有运行firewalld服务的... 目录主要用途基本语法选项1. 状态管理2. 区域管理3. 服务管理4. 端口管理5. ICMP 阻断

Linux实现线程同步的多种方式汇总

《Linux实现线程同步的多种方式汇总》本文详细介绍了Linux下线程同步的多种方法,包括互斥锁、自旋锁、信号量以及它们的使用示例,通过这些同步机制,可以解决线程安全问题,防止资源竞争导致的错误,示例... 目录什么是线程同步?一、互斥锁(单人洗手间规则)适用场景:特点:二、条件变量(咖啡厅取餐系统)工作流

Linux中修改Apache HTTP Server(httpd)默认端口的完整指南

《Linux中修改ApacheHTTPServer(httpd)默认端口的完整指南》ApacheHTTPServer(简称httpd)是Linux系统中最常用的Web服务器之一,本文将详细介绍如何... 目录一、修改 httpd 默认端口的步骤1. 查找 httpd 配置文件路径2. 编辑配置文件3. 保存

Linux使用scp进行远程目录文件复制的详细步骤和示例

《Linux使用scp进行远程目录文件复制的详细步骤和示例》在Linux系统中,scp(安全复制协议)是一个使用SSH(安全外壳协议)进行文件和目录安全传输的命令,它允许在远程主机之间复制文件和目录,... 目录1. 什么是scp?2. 语法3. 示例示例 1: 复制本地目录到远程主机示例 2: 复制远程主

IDEA如何实现远程断点调试jar包

《IDEA如何实现远程断点调试jar包》:本文主要介绍IDEA如何实现远程断点调试jar包的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录问题步骤总结问题以jar包的形式运行Spring Boot项目时报错,但是在IDEA开发环境javascript下编译

Linux基础命令@grep、wc、管道符的使用详解

《Linux基础命令@grep、wc、管道符的使用详解》:本文主要介绍Linux基础命令@grep、wc、管道符的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录grep概念语法作用演示一演示二演示三,带选项 -nwc概念语法作用wc,不带选项-c,统计字节数-

Linux CPU飙升排查五步法解读

《LinuxCPU飙升排查五步法解读》:本文主要介绍LinuxCPU飙升排查五步法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录排查思路-五步法1. top命令定位应用进程pid2.php top-Hp[pid]定位应用进程对应的线程tid3. printf"%