gdb 调试无堆栈??---pthread_join coredump

GDB调试core dump 如何通过core dump文件来定位错误代码 阅读详情

1) 编译的时候添加编译选项

-fstack-protector 和 -fstack-protector-all 这两个选项指示编译器开启栈保护,这样在栈乱序的第一时间可以dump出来现场。可加在Makefile里面, 顺便扯一句,Makefile这种东西对于搞开源软件的人,还真是得精通,我随便想写个Makefile玩着,突然感觉自己头脑一片空白。

-fno-omit-frame-pointer 一个带帧指针和调试信息的版本

或者安装 debug info 包

2)x/xxxa 0x124578

遇到一个堆栈:

(gdb) bt
#0  0x41af821c in free () from /lib/libc.so.6
#1  0x00b28acc in ?? ()
#2  0x00b28acc in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
查看寄存器信息

r0             0x41bb44e0       1102791904
r1             0x20500  132352
r2             0x0      0
r3             0x0      0
r4             0xb28acc 11700940
r5             0xb28ce8 11701480
r6             0x460c2bdc       1175202780
r7             0x460c4920       1175210272
r8             0x0      0
r9             0x460c4460       1175209056
r10            0x400a4000       1074413568
r11            0x460c2be4       1175202788
r12            0x401a8040       1075478592
sp             0x460c2b80       0x460c2b80
lr             0x40192d84       1075391876
pc             0x41af821c       0x41af821c <free+148>
cpsr           0x20000010       536870928
查看$sp附近的地址符号信息:

(gdb) x/128a  $sp-64           
0x460c2b40:     0x2424  0x460c4920      0x1aa54c        0x0
0x460c2b50:     0x0     0x5     0xa0    0x400a4000
0x460c2b60:     0x460c2be4      0x4008bac4 <_dl_fixup+200>      0x400a1708      0x1
0x460c2b70:     0x5     0x0     0x0     0x40192d84 <__free_tcb+100>
0x460c2b80:     0xb28acc        0x401941c8 <pthread_join+240>   0x401940a8 <cleanup>    0xb28ce8
0x460c2b90:     0x152   0x0     0x0     0xa7a7
0x460c2ba0:     0xc40c38        0x460c3d70      0x152   0x0
0x460c2bb0:     0x0     0x2b354 <video_pipline_common::media_vpss_continued_stop()+88>  0xb27430        0x460c2bd4
0x460c2bc0:     0xa311b3        0x460c2bdc      0x1000  0xb2742c
0x460c2bd0:     0x5198  0xb28aa0        0x460c2bec      0x0
0x460c2be0:     0x460c2c0c      0x23dec <media_process::online_callback_by_winslot(int)+132>    0x460c2c0c      0x132b0 <director_driver2::get_resouce_ctx_by_res_id(int)+68>
0x460c2bf0:     0x5     0xb27410        0x2     0xb27450
0x460c2c00:     0xb27430        0xb28aa0        0x460c2c3c      0x1301c <director_driver2::ddr_transit_receive_msg(int, int, void*, void*)+504>
0x460c2c10:     0x180684 <_ZZN10RtspStream12InviteStreamEvE12__FUNCTION__>      0xe     0xb27410        0x0
0x460c2c20:     0x11f6  0x5     0x1802a0        0x2
0x460c2c30:     0xc1cb90        0xb27410        0x460c2c84      0x33134 <RtspMediaReceiveCallBack(void*, RTSP_STREAM_DATA*)+496>
0x460c2c40:     0x28    0x1803e0        0x460c2c94      0x0
0x460c2c50:     0x0     0x0     0x460c2d14      0xc3dae0
0x460c2c60:     0x0     0x460c2d14      0xc1dfd0        0xc3dae0
0x460c2c70:     0xa7a7  0xc40c38        0x460c3d70      0x152
0x460c2c80:     0x460c3d84      0xca234 <RtspStream::InviteStream()+2916>       0xe9    0x28
0x460c2c90:     0x1803e0        0xc40c68        0x1802d0        0x0
0x460c2ca0:     0x1000  0xc40dd0        0x0     0xc40c38
0x460c2cb0:     0x0     0x63617274      0x316b  0x0


可以看出pthread_join在释放TCB(Thread Control Block)的时候出错->__free_tcb->free(),TCB可以设置detach thread属性自动释放

然后我反汇编free 和_free_tcb两个函数,发现两个函数没有对SP做很大的操作,即__free_tcb的返回地址就在sp附近可以看出是pthread_join.

Dump of assembler code for function __free_tcb:
   0x40192d20 <+0>:     push    {r4, lr}
   0x40192d24 <+4>:     add     r2, r0, #132    ; 0x84
   0x40192d28 <+8>:     mov     r4, r0
   0x40192d2c <+12>:    ldr     r3, [r4, #132]  ; 0x84
   0x40192d30 <+16>:    dmb     sy
   0x40192d34 <+20>:    orr     r0, r3, #32
   0x40192d38 <+24>:    ldrex   r1, [r2]
   0x40192d3c <+28>:    cmp     r1, r3
   0x40192d40 <+32>:    bne     0x40192d50 <__free_tcb+48>
   0x40192d44 <+36>:    strex   r12, r0, [r2]
(gdb) disassemble  free
Dump of assembler code for function free:
   0x41af8188 <+0>:     ldr     r3, [pc, #160]  ; 0x41af8230 <free+168>
   0x41af818c <+4>:     ldr     r2, [pc, #160]  ; 0x41af8234 <free+172>
   0x41af8190 <+8>:     push    {lr}            ; (str lr, [sp, #-4]!)
   0x41af8194 <+12>:    add     r3, pc, r3
   0x41af8198 <+16>:    ldr     r3, [r3, r2]
   0x41af819c <+20>:    ldr     r3, [r3]
   0x41af81a0 <+24>:    cmp     r3, #0
   0x41af81a4 <+28>:    bne     0x41af8224 <free+156>
   0x41af81a8 <+32>:    cmp     r0, #0
   0x41af81ac <+36>:    popeq   {pc}            ; (ldreq pc, [sp], #4)
   0x41af81b0 <+40>:    ldr     r3, [r0, #-4]
   0x41af81b4 <+44>:    sub     r1, r0, #8
   0x41af81b8 <+48>:    tst     r3, #2
   0x41af81bc <+52>:    beq     0x41af8200 <free+120>
   0x41af81c0 <+56>:    ldr     r2, [pc, #112]  ; 0x41af8238 <free+176>
pthread_join:
 struct pthread *pd = (struct pthread *) threadid;
......
 if (__glibc_likely (result == 0))
    {
      /* We mark the thread as terminated and as joined.  */
      pd->tid = -1;

      /* Store the return value if the caller is interested.  */
      if (thread_return != NULL)
	*thread_return = pd->result;

      /* Free the TCB.  */
      __free_tcb (pd);
    }
  else
    pd->joinid = NULL;
想打印(struct pthread *) threadid 的时候,发现glibc的库不是debug不能打印。



gdb调试 程序退出没有堆栈信息([Inferior 1 (process 12867) exited with code 0177]) 上周有新任务开发,然后周五开发完了,和其他同事联调(不能远程调试),发现客户端上报给server之后,serever莫名其妙的就挂了,然后被重新启动(重启是自己设置的,只要进程不存在就回去启动程序),只要上报了新增的功能相关的,server就会挂掉,上报原来有的都是正常的。但是并不是被kill掉了,也不是崩溃了。因为程序里收到SIGSEGV和SIGABRT会打印堆栈信息到一个文件里面。但是没有发现有这个文件生成。 后面给了一个抓堆栈的脚本,然后那边同事抓给我的结果是文件为空。我以为没抓到,然后看了下日志,s 阅读详情

相关推荐

POSS-NH2:氨基化笼型聚半倍硅氧烷的合成与应用探索

本文详细介绍了氨基化笼型聚半倍硅氧烷(POSS-NH2)的合成方法与应用。通过水解缩合与官能团转化两种主流路线,可制备出这种关键的纳米增强材料。其核心价值在于通过表面的氨基与树脂基体形成化学键合,从而显著提升复合材料的热稳定性和机械性能。文章以环氧树脂改性为例,展示了POSS-NH2在航空航天、电子封装等高性能领域的应用潜力。

grpc6streamer的博客 498

gdb 问题

##########问题二 gdb 调试 no stack 源程序: #include <stdio.h> void swap(int* a,int* b) { int t=*a; *a=*b; *b=t; } //sizeof() 获得变量占的字节数目,其中第一个字节的地址称为变量的地址 int main() { int a = 3,b = 4; swap(&a,&b); printf("%d %d\n",a,b); return 0; } 执行过程 gcc t

高同学 2807

从STM32转战华大HC32F4A0:我的踩坑实录与10个USART的灵活配置心得

本文分享了从STM32迁移至华大HC32F4A0的实战经验,重点解析了10个USART的灵活配置技巧及常见问题解决方案。通过对比STM32F407,详细介绍了HC32F4A0在外设灵活性、IO功能组设计及多串口应用中的优势,帮助开发者快速掌握国产芯片的开发要点。

weixin_30514745的博客 523

gdb积累学习

逐步积累的gdb调试方法,慢慢学习,让gdb调试变的更加得心应手。

月光xia漫步 5901

RouterOS网桥VLAN实战:从零构建安全隔离的二层虚拟网络

本文详细讲解了如何在RouterOS上利用网桥和VLAN功能,从零开始构建安全隔离的二层虚拟网络。通过分步实战演示,涵盖核心概念、网桥创建、PVID设置、VLAN规则配置及安全过滤,帮助网络管理员实现办公、访客与服务器网络的逻辑隔离与灵活管理,提升网络安全性。

u9v0w的博客 504

ArcMap对遥感图像进行语义分割标注

使用arcmap对遥感图像进行语义分割标注

qq_41708916的博客 4044

gdb调试(四)函数调用栈—stack

什么是函数调用栈 程序每调用一次函数,关于这个函数的信息就会产生。这些信息包括,调用函数的地方、函数的参数、被调用函数变量等。这些信息存储在一个叫做函数调用信息帧的内存中,这些函数信息帧就组成了函数调用栈。 gdb提供了一些指令可以查看这些帧中的信息。当查询函数变量的信息时,gdb就是从这个被选中的帧内获取信息,但是查看被选中帧外的变量信息是非法的。当程序运行停止的时候,gdb会自动...

omygege 456

1.1什么是Zephyr?与FreeRTOSRT-Thread对比

我自己的项目里,三个系统都用过。这个芯片的原厂BSP哪个OS做得最靠谱?(实测,别看广告)项目核心需求是不是某个OS的“长板”?(别为了10%的功能牺牲90%的稳定性)团队三个月后能不能愉快地维护代码?(开发体验影响长期生产力)最后送一句干货:选型定不下来时,拿一块项目用的开发板,分别用三个OS跑同一个demo(比如按键控制LED+串口打印)。移植过程遇到的问题、代码看起来舒不舒服,你的直觉会告诉你答案。嵌入式没有完美解,只有适合当下的解。选好了,就踏实地写代码;

m0_50546716的博客 652

MCP连接器源码中的“幽灵线程”:深入pthread_create调用栈,破解5.2.1版本中未释放的I/O等待线程泄漏问题

定位并修复MCP服务器本地数据库连接器源码分析中的线程泄漏:深入pthread_create调用栈,精准识别5.2.1版本I/O等待线程未释放根源。适用于高并发数据库连接场景,提供可复用的资源清理方案与调试技巧,值得收藏。

GatherLume的博客 262

关闭搜狗输入法右下角广告的解决方案

本文主要介绍了关闭搜狗输入法右下角广告的解决方案,希望能对使用搜狗输入法的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 1万+

[网络安全提高篇] 一二九.Powershell恶意代码检测 (5)混淆和反混淆 [上]

前文介绍了如何利用MS Defender实现恶意样本家族批量标注。这篇文章将继续讲解Powershell恶意代码检测,主要包括PowerShell混淆与反混淆内容,首先结合Invoke-Obfuscation工具详细介绍PowerShell代码混淆方法,再结合PowerDecode工具阐述解混淆方法。该研究将为后续的恶意软件家族分类或溯源提供帮助。未完待续,基础性文章,希望您喜欢,且看且珍惜。

杨秀璋的专栏 1535

【线上问题定位】简单死锁问题定位

目录 测试案例 现象 准备工具 一、PS 概述 二、gcore工具 三、gdb工具 定位步骤 一、保留环境 二、分析Core文件 结论 测试案例 ​ // deadlock.cpp#include <stdio.h>#include <pthread.h>#include "iostream"pthread_mutex_t m1 ;pthread_mutex_t m2 ;void *thread_1(void*) { pthread_mutex_lo

Night_ZW的博客 929

【全局路径规划模块全覆盖算法】(三)代码实现:Boustrophedon Cellular Decomposition Path Planning用珊格地图生成每个cell的覆盖路径

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对Boustrophedon Cellular Decomposition Path Planning用珊格地图生成每个cell的覆盖路径做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容。

qq_35635374的博客 1832

小米嵌入式校招面试指南:Linux系统编程与驱动开发核心技能

嵌入式Linux系统编程是现代嵌入式开发的核心技术之一,其原理基于进程管理、内存映射和多线程同步等操作系统机制。掌握这些技术能够显著提升嵌入式系统的实时性和资源利用率,在物联网网关、智能硬件等场景中具有重要价值。特别是在多路视频采集、设备驱动开发等实际应用中,对中断处理、进程间通信等热点的深入理解尤为关键。本文聚焦小米嵌入式岗位的面试要求,系统梳理了从Linux应用开发到底层驱动开发的完整知识体系,帮助求职者避开常见的技术陷阱,提升项目实践和问题解决能力。

cqbh2011的博客 509

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

CVE-2024-26809漏洞剖析:Linux内核nftables双重释放与权限提升实战

内存管理是操作系统安全的核心基石,其核心原理在于确保内存的分配与释放严格遵循生命周期。当同一块内存被错误地释放两次时,就会触发“双重释放”漏洞,导致内存管理数据结构混乱。这种内存破坏漏洞具有极高的技术价值,因为它可能被利用来篡改关键内核数据结构,最终实现权限提升,直接威胁系统安全。在Linux内核的众多子系统中,nftables作为新一代的防火墙框架,负责处理网络包过滤规则,其内部涉及复杂的内存对象管理。CVE-2024-26809正是一个发生在nftables子系统中的经典双重释放漏洞。攻击者通过构造特定

weixin_34295316的博客 293

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

pthread_join-pthread_detach

Linux中,新建线程并不在原先进程中,而是通过一个系统调用 clone() 创建另一个执行环境 该系统调用clone() copy了一个和原先进程完全一样的进程,并在这个进程中执行线程函数。 该copy过程和fork不一样,copy后的进程和原先的进程共享了所有的变量和运行环境。 【pthread_join】 一个线程等待另一个线程结束 代码中如果没有pthread_join主线程会很快结束从而使整个进程结束, 从而使创建的线程没有机会开始执行就结束了。 加入pthread_join后,主线程会一直等待直

wangkai6666的博客 2920

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

pthread_join 出core

c++ , 多线程

qq_41634872的博客 318

GDB详解

1 简介 2 生成调试信息 3 启动GDB 的方法 4 程序运行上下文     4.1 程序运行参数     4.2 工作目录     4.3 程序的输入输出 5 设置断点     5.1 简单断点     5.2 多文件设置断点     5.3 查询所有断点 6 观察点 7 条件断点 8 维护停止点 9 为停止点设定运行命令 10 调试代码 11 查看运行时数据 ...

weixin_33781606的博客 530

多线程操作C++ STL vector出现概率coredump问题分析------切勿对STL 容器的线程安全性有不切实际的依赖!

多线程操作全局变量,必须考虑同步问题,否则可能出现数据不一致, 甚至触发coredump. 前段时间, 遇到一个多线程操作了全局的vector的问题, 程序崩了。场景是这样的:某全局配置参数保存在一个vector中,需要定时更新(更新线程), 另外的工作线程去读取配置。 这种场景是非常普遍的。 在该场景中,程序没有枷锁,概率coredump, 实际情...

认知 行动 坚持 1万+

gdb常用调试命令以及多线程堆栈的查看

GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。 一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。

NK_test的博客 3万+

避免僵尸线程:线程资源的回收与join、detach

#include &lt;pthread.h&gt;#include &lt;stdio.h&gt;void* __task(void*arg){ return (void*)0;}int main(int agrc, char**argv){ int i = 0; pthread_t pid = 0; int ret = 0; pthread_attr_t attr; for(i=0; i&lt...

bobbypollo的专栏 3980

pthread_create内存泄漏分析

文章目录一、内存泄漏的原因1)背景原因二、内存泄漏的症状三、内存泄漏的分析1)分析一:内存不够用2)分析二:pthread_create创建线程后,系统并未回收其资源,从而导致了泄漏四、内存泄漏原因1)背景2)线程分离状态分类(1)主线程和子线程非分离状态(2)主线程和子线程有分离状态(3)总结五、解决办法1)法一:pthread_join()函数回收相关内存区域2)法二:调用ptread_detach()函数分离线程3)法三:使用线程属性 一、内存泄漏的原因 1)背景原因 ①线程默认堆栈大小是1MB,系统

谢白羽 1249

【Linux】连接已终止的线程(pthread_join)、线程的分离(pthread_detach)、线程取消(pthread_detach)

连接已终止的线程(pthread_join)、线程的分离(pthread_detach)、线程取消(pthread_detach)

mhyasadj的博客 1199

使用GBD调试多线程

今天在公司遇到开发服务器的时候遇到一个Oracle没有第三方库的情况,然后程序直接崩溃,生成CORE文件。最后在同事的帮助下,找到问题所在,在执行设置环境变量的Shell脚本的时候,没有生成Oracle(OCCI)所使用的第三方库的文件和文件夹导致的。 虽说问题解决了,但是在平时的日常开发中更多的使用cout打印输出日志文件。 而在Linux开发过程中没有像Visual Studio的可视化的

J8121的博客 1018

多线程操作 pthread_create pthread_join

进程是表示资源分配的基本单位,又是调度运行的基本单位。例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格、内存空间、磁盘空间、I/O设备等。然后,把该进程放人进程的就绪队列。进程调度程序选中它,为它分配CPU以及其它有关资源,该进程才真正运行。所以,进程是系统中的并发执行的单位。在Mac、Windows NT等采用微内核结构的操作系统中,进程的功能发生了变化:它只是资源分配的基本单位,而不再是调度运行的单位。在微内核系统中,真正调度运行的基本单位是线程。

TyearLin的专栏 4927

Linux多线程

函数用于创建新线程,并在新线程中执行指定的函数。thread:指向线程ID的指针,用于存储新线程的ID。attr:线程属性,通常设置为NULL,表示使用默认属性。:线程执行的函数,这个函数接受一个void*参数,可以用来传递数据给新线程。arg:传递给函数的参数。如果成功创建线程,返回0。如果出现错误,返回相应的错误码。线程创建成功后,新线程会执行函数,可以通过或来回收线程资源。创建的线程默认是可连接(joinable)的,需要调用来等待线程的结束并回收资源。函数。

m0_60748489的博客 391
上一篇: linux程序内存信息pmap
下一篇: 利用进程信息追查内存泄漏
linux_vae
博客等级 码龄15年 48粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值