精华内容
下载资源
问答
  • 使用gdb 查看coredump堆栈信息

    千次阅读 2020-04-15 11:03:17
    简介 core dump 一般是在segmentation fault(段错误)的情况下产生的文件,需要通过ulimit来设置...查看栈信息 ————— 当程序被停住了,你需要做的第一件事就是查看程序是在哪里停住的。当你的程序 调用了一...

    参考:https://blog.csdn.net/mergerly/article/details/41994207

    简介

    core dump 一般是在segmentation fault(段错误)的情况下产生的文件,需要通过ulimit来设置才会得到的。

    调试的话输入: gdb filename core  

    filename就是产生core文件的可执行文件,core就是产生的dump文件

    查看栈信息
    —————

    当程序被停住了,你需要做的第一件事就是查看程序是在哪里停住的。当你的程序
    调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入
    “栈”(Stack)中。你可以用GDB命令来查看当前的栈中的信息。

    命令

    backtrace

    bt(简略)
    打印当前的函数调用栈的所有信息。如:

    (gdb) bt
    #0 func (n=250) at tst.c:6
    #1 0x08048524 in main (argc=1, argv=0xbffff674) at tst.c:30
    #2 0x400409ed in __libc_start_main () from /lib/libc.so.6

    从上可以看出函数的调用栈信息:__libc_start_main --> main()--> func()


    backtrace
    bt
    n是一个正整数,表示只打印栈顶上n层的栈信息。

    backtrace <-n>
    bt <-n>
    -n表一个负整数,表示只打印栈底下n层的栈信息。

    bt full 查看完整栈信息

    frame

    f(简略)

    如果你要查看某一层的信息,你需要在切换当前的栈,一般来说,程序停止时,最顶
    层的栈就是当前栈,如果你要查看栈下面层的详细信息,首先要做的是切换当前栈。

    n是一个从0开始的整数,是栈中的层编号。比如:frame 0,表示栈顶,frame 1,表示栈的第二层。

    up
    表示向栈的上面移动n层,可以不打n,表示向上移动一层。

    down
    表示向栈的下面移动n层,可以不打n,表示向下移动一层。

    上面的命令,都会打印出移动到的栈层的信息。如果你不想让其打出信息。你可以使用这三个命令:

    select-frame 对应于 frame 命令。
    up-silently 对应于 up 命令。
    down-silently 对应于 down 命令。


    查看当前栈层的信息,你可以用以下GDB命令:

    frame 或 f
    会打印出这些信息:栈的层编号,当前的函数名,函数参数值,函数所在文件及行号,函数执行到的语句。

    info frame
    info f

    这个命令会打印出更为详细的当前栈层的信息,只不过,大多数都是运行时的内内
    地址。比如:函数地址,调用函数的地址,被调用函数的地址,目前的函数是由什么
    样的程序语言写成的、函数参数地址及值、局部变量的地址等等。如:

    info f
    Stack level 0, frame at 0xbffff5d4:
    eip = 0x804845d in func (tst.c:6); saved eip 0x8048524
    called by frame at 0xbffff60c
    source language c.
    Arglist at 0xbffff5d4, args: n=250
    Locals at 0xbffff5d4, Previous frame's sp is 0x0
    Saved registers:
    ebp at 0xbffff5d4, eip at 0xbffff5d8

    info args
    打印出当前函数的参数名及其值。

    info locals
    打印出当前函数中所有局部变量及其值。

    info catch
    打印出当前的函数中的异常处理信息。

    eg:info local

    (gdb) info local
    jInputBuf = {m_ptr = 0x7f50033070}
    res = 0 '\000'
    t = 545804745024
    (gdb) info args
    this = 0xd021e70
    event = <optimized out>
    eventData = <optimized out>
    

    可以看到jInputBuf的内存地址,那我们可以使用如下命令,将这个地址装成对象指针来查询其成员变量:
    p ((JmfBuffer*)0x7f50033070)->mRangeLength

    (gdb) p ((JmfBuffer*)0x7f50033070)->mRangeLength
    $11 = 12441600

    显示源代码

    GDB 可以打印出所调试程序的源代码,当然,在程序编译时一定要加上-g的参数,把
    源程序信息编译到执行文件中。不然就看不到源程序了。当程序停下来以后,
    GDB会报告程序停在了那个文件的第几行上。你可以用list命令来打印程序的源代
    码。还是来看一看查看源代码的GDB命令吧。

    list
    显示程序第linenum行的周围的源程序。

    list
    显示函数名为function的函数的源程序。

    list
    显示当前行后面的源程序。

    list -
    显示当前行前面的源程序。

    一般是打印当前行的上5行和下5行,如果显示函数是是上2行下8行,默认是10行,当
    然,你也可以定制显示的范围,使用下面命令可以设置一次显示源程序的行数。

    set listsize
    设置一次显示源代码的行数。

    show listsize
    查看当前listsize的设置。

    list命令还有下面的用法:

    list ,
    显示从first行到last行之间的源代码。

    list ,
    显示从当前行到last行之间的源代码。

    list +
    往后显示源代码。

    一般来说在list后面可以跟以下这们的参数:

    行号。
    <+offset> 当前行号的正偏移量。
    <-offset> 当前行号的负偏移量。
    哪个文件的哪一行。
    函数名。
    哪个文件中的哪个函数。

    list 文件名:函数名
    <*address> 程序运行时的语句在内存中的地址。

    list *内存地址

    源码的内存

    你可以使用info line命令来查看源代码在内存中的地址。info line后面可以跟
    “行号”,“函数名”,“文件名:行号”,“文件名:函数名”,这个命令会打印出所指定的
    源码在运行时的内存地址,如:

    (gdb) info line tst.c:func
    Line 5 of "tst.c" starts at address 0x8048456 and ends at 0x804845d.

    还有一个命令(disassemble)你可以查看源程序的当前执行时的机器码,这个命令
    会把目前内存中的指令dump出来。如下面的示例表示查看函数func的汇编代码。

    (gdb) disassemble func
    Dump of assembler code for function func:
    0x8048450 : push %ebp
    0x8048451 : mov %esp,%ebp
    0x8048453 : sub $0x18,%esp
    0x8048456 : movl $0x0,0xfffffffc(%ebp)
    0x804845d : movl $0x1,0xfffffff8(%ebp)
    0x8048464 : mov 0xfffffff8(%ebp),%eax
    0x8048467 : cmp 0x8(%ebp),%eax
    0x804846a : jle 0x8048470
    0x804846c : jmp 0x8048480
    0x804846e : mov %esi,%esi
    0x8048470 : mov 0xfffffff8(%ebp),%eax
    0x8048473 : add %eax,0xfffffffc(%ebp)
    0x8048476 : incl 0xfffffff8(%ebp)
    0x8048479 : jmp 0x8048464
    0x804847b : nop
    0x804847c : lea 0x0(%esi,1),%esi
    0x8048480 : mov 0xfffffffc(%ebp),%edx
    0x8048483 : mov %edx,%eax
    0x8048485 : jmp 0x8048487
    0x8048487 : mov %ebp,%esp
    0x8048489 : pop %ebp
    0x804848a : ret
    End of assembler dump.

    程序变量

    在GDB中,你可以随时查看以下三种变量的值:
    1、全局变量(所有文件可见的)
    2、静态全局变量(当前文件可见的)
    3、局部变量(当前Scope可见的)

    如果你的局部变量和全局变量发生冲突(也就是重名),一般情况下是局部变量会隐
    藏全局变量,也就是说,如果一个全局变量和一个函数中的局部变量同名时,如果当
    前停止点在函数中,用print显示出的变量的值会是函数中的局部变量的值。如果
    此时你想查看全局变量的值时,你可以使用“::”操作符:

    file::variable
    function::variable
    可以通过这种形式指定你所想查看的变量,是哪个文件中的或是哪个函数中的。例如,查看文件f2.c中的全局变量x的值:

    gdb) p 'f2.c'::x

    当然,“::”操作符会和C++中的发生冲突,GDB能自动识别“::”是否C++的操作符,所以你不必担心在调试C++程序时会出现异常。

    另外,需要注意的是,如果你的程序编译时开启了优化选项,那么在用GDB调试被优
    化过的程序时,可能会发生某些变量不能访问,或是取值错误码的情况。这个是很
    正常的,因为优化程序会删改你的程序,整理你程序的语句顺序,剔除一些无意义的
    变量等,所以在GDB调试这种程序时,运行时的指令和你所编写指令就有不一样,也
    就会出现你所想象不到的结果。对付这种情况时,需要在编译程序时关闭编译优化。
    一般来说,几乎所有的编译器都支持编译优化的开关,例如,GNU 的C/C++编译器
    GCC,你可以使用“-gstabs”选项来解决这个问题。关于编译器的参数,还请查看编
    译器的使用说明文档。

    查看内存

    你可以使用examine命令(简写是x)来查看内存地址中的值。x命令的语法如下所示:

    x/

    n、f、u是可选的参数。

    n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。
    f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。
    u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。
     
    u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字节,g表示八字节。
     当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。

    表示一个内存地址。

    n/f/u三个参数可以一起使用。例如:

    命令:x/3uh 0x54320表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十六进制显示。

    注意

    1.gdb执行coredump文件:./aarch64-buildroot-linux-gnu-gdb(gdp)(进程) (coredump文件)
    2.设置符号表:set sysroot aarch64-buildroot-linux-gnu/aarch64-buildroot-linux-gnu/sysroot
    3.bt full打印堆栈
    当没有so动态库的打印行信息 可以在so的编译Makefile加入-g编译选项

     

     

    展开全文
  • jvm学习之dump堆栈信息

    2014-03-17 01:44:40
    准备工具: eclipse 做如下参数设置: Windows->Preferences->Java->Installed JREs->Edit JRE, 这个时候...上述参数设置的意思是:设置堆内存最小为2m,最大也为2m,并且在发生OOM的时候dump内存...
    准备工具:
    eclipse
    做如下参数设置:
    Windows->Preferences->Java->Installed JREs->Edit JRE, 这个时候设置Default VM arguments=-Xms2m -Xmx2m -XX:+HeapDumpOnOutOfMemoryError
    上述参数设置的意思是:设置堆内存最小为2m,最大也为2m,并且在发生OOM的时候dump内存
    还需要一步就是安装MAT:
    链接如下:http://download.eclipse.org/mat/1.3.1/update-site/

    好了现在写一个测试程序跑一下:

    package com.luch.security.demo;

    import java.util.ArrayList;
    import java.util.List;

    public class OOMTest {


    static class OOMObject {
    }

    public static void main(String[] args) {
    List<OOMObject> list = new ArrayList<OOMObject>();
    while (true) {
    list.add(new OOMObject());
    }

    }

    }



    直接运行上面的代码就可以,会出现OOM error,这个时候就会生成一个dump堆栈信息的文件:名字如java_pid16824.hprof
    如果你的eclipse安装了MAT插件,那么这个时候,你就可以直接打开,并且可以找到这样的信息:
    Thread Stack


    main
    at java.lang.OutOfMemoryError.<init>()V (Unknown Source)
    at java.util.Arrays.copyOf([Ljava/lang/Object;ILjava/lang/Class;)[Ljava/lang/Object; (Unknown Source)
    at java.util.Arrays.copyOf([Ljava/lang/Object;I)[Ljava/lang/Object; (Unknown Source)
    at java.util.ArrayList.ensureCapacity(I)V (Unknown Source)
    at java.util.ArrayList.add(Ljava/lang/Object;)Z (Unknown Source)
    at com.luch.security.demo.OOMTest.main([Ljava/lang/String;)V (OOMTest.java:15)

    哈哈,这样就可以帮忙程序员分析到底是因为什么原因导致的OOM了
    展开全文
  • java dump堆栈分析工具

    2020-10-16 17:03:41
    java dump 堆栈 dumpAnalyzer 分析,在日常工作中,经常会遇到,系统跑着跑着就会出现性能问题,CPU居高不下。这个时候我们就需要对系统的堆栈信息进行分析。这里就介绍如何使用IBM内存检测工具(dumpAnalyzer)。
  • java dump堆栈分析

    千次阅读 2019-04-18 19:16:24
    这个时候我们就需要对系统的堆栈信息进行分析。这里就介绍如何使用IBM内存检测工具(dumpAnalyzer)。 本文以tomcat内存分析为例 dumpAnalyzer工具下载地址:...

    在日常工作中,经常会遇到,系统跑着跑着就会出现性能问题,CPU居高不下。这个时候我们就需要对系统的堆栈信息进行分析。这里就介绍如何使用IBM内存检测工具(dumpAnalyzer)。

    本文以tomcat内存分析为例
    dumpAnalyzer工具下载地址:https://download.csdn.net/download/jackson_hou03/11126031

    1、获取系统的进程号
    在这里插入图片描述
    2、获取指定进程的堆栈信息
    在这里插入图片描述
    3、将日志文件下载到本地,并用dumpAnalyzer工具打开
    在这里插入图片描述
    4、右键查看堆栈信息
    在这里插入图片描述
    5、分析一
    在这里插入图片描述
    找到哪种状态的进程占多数,如图现在Waiting on condition占的比较多

    6、分析二
    在这里插入图片描述
    在这里找到代码相关的部分,就可以有目的的优化了(因为我已经优化过了,所以没有看到自己代码相关的部分)。
    如此就可以很方便的找到问题,进行优化。

    END!!!

    展开全文
  • docker容器管理,OOM,内存溢出,dump文件堆栈信息分析一、dump文件(.hprof)日志生成方式二、OOM时,dump文件分析 一、dump文件(.hprof)日志生成方式 1.方式一: order.jar 包运行时候加参数,当服务OOM的时候会...

    docker容器管理,OOM,内存溢出,dump文件堆栈信息分析

    一、dump文件(.hprof)日志生成方式

    1.方式一: order.jar 包运行时候加参数,当服务OOM的时候会自动导出dump文件

    -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=目录
    
    1. 方式二: 根据进程PID,手动导出进程文件
    jmap -dump:live,format=b,file=m.hprof PID //在docker容器内执行
    

    执行图示

    注意:因为docker容器管理导出的文件在容器中,需要保重容易与宿主机之间挂载有目录挂载,实现宿主机与容器之间实心文件共享docke容器与宿主机之间目录挂载

    二、OOM时,dump文件分析

    1. 把文件从服务器上下载

    在这里插入图片描述

    1. 使用dump文件分析工具MAT

    2. 下载MAT
      在这里插入图片描述

    3. 看下要分析的.hprof文件的大小,修改mat/MemoryAnalyzer.ini中 -Xmx1024m的大小,爆保证修改之后的大小大于要分析的文件大小

    4. 点击MemoryAnalyzer.exe,出现工具界面

    5. 点击file/Open Heap Dump…,打开下载到本地的.hprof文件
      在这里插入图片描述

    6. 打开之后,点击finish,分析过程比较慢需要一段时间。

    在这里插入图片描述
    8. 点击Leak suspects

    9. 查看第一个占用内存大的问题的堆栈信息
    在这里插入图片描述
    10. 具体的堆栈信息,此信息跟idea和eclipse的控制台报错信息一致,可自己分析代码问题
    在这里插入图片描述

    1. 也可以看问题详情
      在这里插入图片描述
      12,具体信息
      在这里插入图片描述
    展开全文
  • 脚本打开全部coredump查看堆栈信息

    千次阅读 2014-04-03 16:10:47
    使用opengdb.sh一次性打开当前目录下全部coredump chmod +x ./foxygdb for file in `ls -rt | grep 'core.'` do echo "|------------------------------------------------------------------...
  • 最近在看dubbo源码,真的学习了很多...废话不多说,在dubbo内部有几种线程模型,都是使用java线程池实现的,任务被拒绝后会输出堆栈信息。我们可以看它是怎么实现的。 package org.apache.dubbo.common.threadpoo...
  • 在Linux下可通过core文件来获取当程序异常退出(如异常信号SIGSEGV, SIGABRT等)时的堆栈信息。core dump叫做核心转储,当程序运行过程中发生异常的那一刻的一个内存快照,操作系统在程序发生异常而异常在进程内部又...
  • 1. jstack PID jstack PID > 123.txt 可以查看指定进程的所有线程状态 2. jmap -dump:format=b,file=123.hprof PID
  • 堆栈dump文件分析工具

    2014-04-26 10:06:53
    IBM java dump 文件分析工具,分析java堆栈信息
  • JVM堆栈dump解析

    2020-06-13 21:50:43
    thread dump 是一个文本文件。是JVM各线程运行情况的快照。以栈的形式记录。能帮助我们分析程序什么地方出现问题。...此外还有些其他信息,如下图所示。 使用JDK的工具 获取dump 获取thre...
  • 崩溃捕捉的dump没有提供堆栈的问题 ...通过此堆栈信息看不出任何崩溃的具体原因。再输入~*kv命令查看所有线程的堆栈: 可以看到崩溃的线程,输入~56s切换到该线程,再输入kv查看该线程的堆栈如下: 注意U
  • jstack使用和线程堆栈dump分析

    千次阅读 2017-10-15 21:06:15
    查看并dump出线程堆栈信息,在DOS窗口中显示: 或者直接将日志信息输出到文件(管理员身份): -l long listings,会打印出额外的锁信息,在发生死锁时可以用jstack -l pid来观察锁持有情况 -m mixed mode,...
  • 有一坨dump文件,一个一个拿vs来分析太浪费时间,现在想把它们转成文本格式,这样分析起来很快捷。 求解决方案。
  • Windows下有三种生成dump文件的方式: 1.通过任务管理器和注册表;2.WinDbg抓取;3.程序中加入存储Dump的代码 具体生成方法参看:Windows下dump文件生成与分析 本文详细介绍如何在程序中加入存储dump的代码: ...
  • 崩溃捕捉的dump没有提供堆栈的问题 前两天客户现场出现了...通过此堆栈信息看不出任何崩溃的具体原因。再输入~*kv命令查看所有线程的堆栈: 可以看到崩溃的线程,输入~56s切换到该线程,再输入kv查看该线程的堆...
  • 查看堆栈信息

    2019-03-21 00:38:28
    生成堆栈文件 通过jdk自带工具生成,线上使用的时候执行的时候提示找不到pid对应的文件,加上-F参数可以强制关联上 jmap -F -dump:format=b,file=d:\dump\heap.hprof <pid> 下面这个没有使用过,目测可以 ...
  • Linux :打印堆栈信息

    2020-10-10 15:49:31
    Linux :打印堆栈信息 一、在需要打印堆栈信息的函数里面添加dump_stack(); 二、查看打印log。
  • Android下堆栈信息打印

    2019-02-27 09:43:28
    kernel层 linux kernel中有堆栈打印的API接口dump_stack,直接调用即可;dump_stack的实现在kernel中的msm-3.18/lib/dump_stack.c 和msm-3.18/kernel/printk/printk.c...c语言中的堆栈信息打印,需要自己实现接口,接...
  • 堆栈信息分析

    2015-11-03 22:27:00
    一、堆栈信息解读 2013-01-13 11:02:31 Full thread dump Java HotSpot(TM) Client VM (23.1-b03 mixed mode, sharing): "[ThreadPool Manager] - Idle Thread" daemon prio=6 tid=0x069a3400 nid=0x84 in Object...
  • 用 C/C++ 编写的程序, 如果遇到 Segmentation Fault 则可以通过生成 coredump 来进行调试, 根据记录的信息定位到出错代码行. 但很多时候可能用 gdb ...例如, 下图是 coredump 后用 gdb 看到的堆栈信息, 可以看到这些
  • 输入命令:jps -lvm :用于查看当前机器上运行的java进程 输入命令: jstack -l pid :jstack -l 6812 查看... no.dump堆栈信息打印到当前目录 转载于:https://www.cnblogs.com/liudongdong666666/p/8961101.html...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 894
精华内容 357
关键字:

dump堆栈信息