首页 > 系统相关 >linux下使用gdb

linux下使用gdb

时间:2023-12-13 18:06:12浏览次数:36  
标签:-% core 文件 int linux gdb 使用 main

运行linux时,我们可以为程序设定程序在崩溃的时候生成core文件,以便于我们可以查找程序崩溃的原因。 步骤: 1. core文件配置 2. 配置生成core文件名称和路径 3. gdb调试core文件 4. 测试带动态库的程序

core 文件配置

查看系统配置生成core文件大小,输入命令行 ulimit -c/ulimit -a 命令查看系统是否开启了生成core文件的功能; image.png core file size显示为0,表示没有开启core文件的产生;即使程序崩溃时,系统也不会生成core文件; 临时做法:输入 ulimit -cu unlimited,即设置产生的core文件的最大容量不做限制; image.png 永久做法:在/etc/profile 后面加上一行

ulimit -c unlimited

修改完之后,source /etc/profile,使得配置生效;

配置生成core文件名称和路径

临时做法: 设置pid作为文件扩展名

echo "1" > /proc/sys/kernel/core_uses_pid

控制core文件保存位置和文件名格式

echo "/root/test/gdb/core-%e-%p-%t" > /proc/sys/kernel/core_pattern

命令格式说明: image.png 永久做法:需要在系统配置文件/etc/stsctl.conf中配置:

kernel.core.uses_pid=1
#note:the core file must dump on the 777 path,such as "/work/core"
kernel.core_parttern=/work/core/core-%e-%p-%t

然后置信号sysctl -p 立即生效,检查是否生效: image.png 如果重启电脑之后还是没有无法生效,则需要再次执行sysctl -p

gdb调试core文件

默认格式:

gdb your_program core

如果你有一个core文件,确保它与你要调试的可执行文件相关联。如果core文件的名称不是默认的core,可以使用-c选项将其与可执行文件关联起来。例如:

gdb -c core your_program

GDB会显示相关的调试信息并暂停在发生错误的位置。可以使用常用的GDB命令来分析和调试代码。

简单代码调试

test.cpp

#include <iostream>
#include <stdlib.h>

void testMemoryLeak() {
	//int*p = (int*)malloc(sizeof(int));
	int *p;
	*p = 10;
	std::cout << "*p=" << *p << std::endl;
}

int main() {
	testMemoryLeak();
	return 0;
}

编译运行:编译的时候加上-g选项; image.png gdb调试core文件 image.png 显示在程序的13行有段错误!

测试带动态库的程序

动态库程序

testlibrary.h

#pragma once
#include <iostream>
int addSum(const int a, const int b);
void mySwap(int *pA, int *pB);

testlibrary.cpp

#include "testlibrary.h"
int addSum(const int a, const int b) {
	return a+b;
}
void mySwap(int *pA, int *pB){
int temp = *pA;
*pA = *pB;
*pB = temp;
}

执行该指令: image.png 编译当前目录下生成libtestlibrary.so动态库;

应用程序

main.cpp

#include "testlibrary.h"
#include <iostream>

int main() {
	int a = 10;
	int b = 20;
	std::cout << "a=" << a << std::endl;
	std::cout << "b=" << b << std::endl;
	int *p1,*p2;
	mySwap(&p1, &p2);
	std::cout << "*p1=" << *p1 << std::endl;
	std::cout << "*p2=" << *p2 << std::endl;
	return 0;
}

执行该指令: image.png 链接libtestlibrary.so 和main.cpp,生成可执行文件 main; 将libtestlibrary.so拷贝到 /usr/lib/路径下: image.png 即可执行main文件,产生core文件: image.png gdb调试core文件 image.png 明确在testlibrary.cpp的 *pA=*pB;处崩溃的; 执行bt,知道在main.coo的第10行报错的: image.png

附加

执行gdb运行程序

配置环境变量:

 export LD_LIBRARY_PATH=/work/:$LD_LIBRARY_PATH

运行程序 gdb main(未成功,下面贴了一张别人的图) image.png

标签:-%,core,文件,int,linux,gdb,使用,main
From: https://blog.51cto.com/u_15804342/8804742

相关文章

  • 恒创科技:如何解决Linux服务器性能问题?
    ​Linux服务器以其稳定性和可靠性而闻名,但与任何系统一样,它们有时也会遇到性能问题。当您的Linux服务器的性能开始下降时,必须及时解决问题以确保应用程序和服务的顺利运行。在本文中,我们将探讨排除和解决Linux服务器性能问题的一些基本步骤。监控工具。首先使用top......
  • 使用免费内网穿透工具随时随地访问PVE(Proxmox Virtual Environment)
    什么是PVE?ProxmoxVirtualEnvironment(简称ProxmoxVE)是一种开源的虚拟化平台,它集成了虚拟化和容器技术。以下是一些导致越来越多人使用ProxmoxVE的原因:开源性质:ProxmoxVE是开源软件,这意味着用户可以自由地查看、修改和分发其源代码。这种自由度吸引了许多用户,尤其是那些寻求经......
  • 铁威马NAS使用docker方式运行Solopace.Gem客户端
     安装DockerManagerNAS系统版本:系统桌面点击启动“应用中心”,搜索docker,选择“DockerManager”进行安装选择“已安装”菜单栏,找到DockerManager并启用开启ssh远程连接桌面打开:控制面板>>终端与SNMP>>Telnet/SSH,按照下图设置并应用运行SolopaceGemDocker容器使用任意支持ssh协......
  • 六、Playbook基本使用
    六、Playbook基本使用6.1Playbook介绍​ ansbile-playbook是一系列ansible命令的集合,利用yaml语言编写。playbook命令根据自上而下的顺序依次执行。同时,playbok开创了很多特性,它可以允许你传输某个命令的状态到后面的指令,如你可以从一台机器的文件中抓取内容并附为变量,然后在另......
  • 简单使用
    publicclassStateListenerimplementsApplicationListener<ContextRefreshedEvent>{@ResourceprivateConnectionFactoryconnectionFactory;@BeanpublicQueueserviceQueue(){returnnewQueue(SERVICE_QUEUE);}/**......
  • 除了Promise.all(),使用Promise.allSettled()方式请求,避免使用循环请求
    constgetFilePromises:Promise<any>[]=[];fileIds.forEach((item)=>{getFilePromises.push(getFileInfoApi({id:item}));});Promise.allSettled(getFilePromises).then((res)=>{this.fileList=res.map((item,index)=>......
  • VSCode 中使用 AI智能编程工具的几个小妙招
    可能你已经在IDE中安装了CodeGeeX,也了解到CodeGeeX能够帮助你编写代码、调试问题、创建文档,生成单元测试等。但是总有些“Wow!”时刻,还在等你发现。今天就介绍几个CodeGeeX插件在VSCode中的使用技巧和小窍门。一、侧边栏放右边,效率倍增默认情况下,CodeGeeX插件在VSCode中成功安装......
  • websocket使用
    WEBSocket(客户端和服务器能够双向同时传输数据):应用层协议,客户端和服务器建立连接时采用http握手方式,建立连接后利用http协议的Upgrade属性将协议变更为WebSocket协议(通过TCP协议来传输数据)http和websocket相同点:1都是建立在TCP之上,通过TCP协议来传输数据;2都是可靠性传输协议......
  • ubuntu 18.04.6 编译文件系统buildroot的时候提示 buildroot/output/host/ARM-buildro
    错误提示如下:ln::无法创建符号链接buildroot/output/host/ARM-buildroot-linux-gnueabihf/sysroot/usr/lib没有文件或目录  cd进入buildroot路径,先sudomakeclean 然后再cd..到software文件夹重新make就可以了。  ......
  • Asp.net core Net6.0 Webapi 项目如何优雅地使用内存缓存
    前言缓存是提升程序性能必不可少的方法,Asp.netcore支持多级缓存配置,主要有客户端缓存、服务器端缓存,内存缓存和分布式缓存等。其中客户端缓和服务器端缓存在使用上都有比较大的限制,而内存缓和分布式缓存则比较灵活。内存缓存就是一种把缓存数据放到应用程序内存中的机制。本......