精华内容
下载资源
问答
  • Linux下怎么产生core dump文件及GDB怎么调试core.pptx Linux下怎么产生core dump文件及GDB怎么调试core.pptx
  • gdb调试core文件

    千次阅读 2015-11-20 17:49:34
    只要分析下core文件,那么就很容易找到程序是在哪一行出现coredump的。通常情况下,在程序出现coredump的时候,系统会把程序运行时的内存,寄存器状态,堆栈指针等信息保存到一个文件中,这个文件就是core文件。1) ...

    在Linux下进行C/C++开发的小伙伴们应该都遇到过coredump的情况,遇到情况应该怎么处理呢?怎么定位问题所在?只要分析下core文件,那么就很容易找到程序是在哪一行出现coredump的。通常情况下,在程序出现coredump的时候,系统会把程序运行时的内存,寄存器状态,堆栈指针等信息保存到一个文件中,这个文件就是core文件。

    1) 如何让程序崩溃的时候产生core文件?
    系统命令: ulimit
    查看当前core文件的设置情况:ulimit -a
    这里写图片描述
    从上面可以看出,core file size的值为0,也就是说程序崩溃的时候不会产生core file,只要设置这个值大于0,那么程序出现coredump的时候就会产生core file了。
    设置命令: ulimit -c core文件大小(unlimited代表无限大)
    执行命令: ulimit -c unlimited
    查看当前core文件的设置情况:ulimit -a
    这里写图片描述

    这时,在程序coredump就会产生一个core文件。

    2) gdb调试core文件

    首先编写一个会导致coredump的程序,如下:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        char *p = "hello world!";
        p[0] = 'a';  // 写只读存储区,这里会出现coredump
    
        return 0;
    }

    然后保存在test.cpp文件中,编译: g++ -o test -g test.cpp
    编译时添加-g指令可以让core文件保存更多的信息。
    执行./test程序后就会在当前目录产生一个core文件,如:core.14809
    gdb分析core文件的指令: gdb 程序 core文件
    如上面编译得到的程序是test,执行命令: gdb test core.14809
    这里写图片描述
    从上面可以看出,程序的第6行导致coredump。
    同时可以采用:gdb -c core文件 的命令查看core文件的信息。
    这里写图片描述

    where命令用于查看出现coredump的位置。

    展开全文
  • 怎么样用GBD调试core文件

    千次阅读 2012-05-14 09:55:25
    一个调试示例  源程序:tst.c  代码:  1 #include  2  3 int func(int n)  4 {  5 int sum=0,i;  6 for(i=0; i  7 {  8 sum+=i;  9 }  10 return sum;  11 }  12  13  14...
    一个调试示例 

    源程序:tst.c 

    代码: 
    1 #include 

    3 int func(int n) 
    4 { 
    5      int sum=0,i; 
    6      for(i=0; i 
    7      { 
    8          sum+=i; 
    9      } 
    10    return sum; 
    11 } 
    12 
    13 
    14 main() 
    15 { 
    16      int i; 
    17      long result = 0; 
    18      for(i=1; i <=100; i++) 
    19      { 
    20            result += i; 
    21      } 
    22 
    23      printf("result[1-100] = %d 
    ", result ); 
    24      printf("result[1-250] = %d 
    ", func(250) ); 
    25 } 


    编译生成执行文件:(Linux下) 
    hchen/test> cc -g tst.c -o tst 

    使用GDB调试: 

    代码: 
    hchen/test> gdb tst <---------- 启动GDB 
    GNU gdb 5.1.1 
    Copyright 2002 Free Software Foundation, Inc. 
    GDB is free software, covered by the GNU General Public License, and you are 
    welcome to change it and/or distribute copies of it under certain conditions. 
    Type "show copying" to see the conditions. 
    There is absolutely no warranty for GDB. Type "show warranty" for details. 
    This GDB was configured as "i386-suse-linux"... 
    (gdb) l <-------------------- l命令相当于list,从第一行开始例出原码。 
    1 #include 

    3 int func(int n) 
    4 { 
    5 int sum=0,i; 
    6 for(i=0; i 
    7 { 
    8 sum+=i; 
    9 } 
    10 return sum; 
    (gdb) <-------------------- 直接回车表示,重复上一次命令 
    11 } 
    12 
    13 
    14 main() 
    15 { 
    16 int i; 
    17 long result = 0; 
    18 for(i=1; i <=100; i++) 
    19 { 
    20 result += i; 
    (gdb) break 16 <-------------------- 设置断点,在源程序第16行处。 
    Breakpoint 1 at 0x8048496: file tst.c, line 16. 
    (gdb) break func <-------------------- 设置断点,在函数func()入口处。 
    Breakpoint 2 at 0x8048456: file tst.c, line 5. 
    (gdb) info break <-------------------- 查看断点信息。 
    Num Type Disp Enb Address What 
    1 breakpoint keep y 0x08048496 in main at tst.c:16 
    2 breakpoint keep y 0x08048456 in func at tst.c:5 
    (gdb) r <--------------------- 运行程序,run命令简写 
    Starting program: /home/hchen/test/tst 

    Breakpoint 1, main () at tst.c:17 <---------- 在断点处停住。 
    17 long result = 0; 
    (gdb) n <--------------------- 单条语句执行,next命令简写。 
    18 for(i=1; i <=100; i++) 
    (gdb) n 
    20 result += i; 
    (gdb) n 
    18 for(i=1; i <=100; i++) 
    (gdb) n 
    20 result += i; 
    (gdb) c <--------------------- 继续运行程序,continue命令简写。 
    Continuing. 
    result[1-100] = 5050 <----------程序输出。 

    Breakpoint 2, func (n=250) at tst.c:5 
    5 int sum=0,i; 
    (gdb) n 
    6 for(i=1; i <=n; i++) 
    (gdb) p i <--------------------- 打印变量i的值,print命令简写。 
    $1 = 134513808 
    (gdb) n 
    8 sum+=i; 
    (gdb) n 
    6 for(i=1; i <=n; i++) 
    (gdb) p sum 
    $2 = 1 
    (gdb) n 
    8 sum+=i; 
    (gdb) p i 
    $3 = 2 
    (gdb) n 
    6 for(i=1; i <=n; i++) 
    (gdb) p sum 
    $4 = 3 
    (gdb) bt <--------------------- 查看函数堆栈。 
    #0 func (n=250) at tst.c:5 
    #1 0x080484e4 in main () at tst.c:24 
    #2 0x400409ed in __libc_start_main () from /lib/libc.so.6 
    (gdb) finish <--------------------- 退出函数。 
    Run till exit from #0 func (n=250) at tst.c:5 
    0x080484e4 in main () at tst.c:24 
    24 printf("result[1-250] = %d 
    ", func(250) ); 
    Value returned is $6 = 31375 
    (gdb) c <--------------------- 继续运行。 
    Continuing. 
    result[1-250] = 31375 <----------程序输出。 

    Program exited with code 027. <--------程序退出,调试结束。 
    (gdb) q <--------------------- 退出gdb。 
    hchen/test> 


    好了,有了以上的感性认识,还是让我们来系统地认识一下gdb吧。 

    使用GDB 

          一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。如: 
    > cc -g hello.c -o hello 
    > g++ -g hello.cpp -o hello 
    如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。当你用-g把调试信息加入之后,并成功编译目标代码以后,让我们来看看如何用gdb来调试他。 

    启动GDB的方法有以下几种: 
    1、gdb 
    program也就是你的执行文件,一般在当然目录下。 
    2、gdb core 
    用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。 
    3、gdb 
    如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。 
          GDB启动时,可以加上一些GDB的启动开关,详细的开关可以用gdb -help查看。我在下面只例举一些比较常用的参数: 
    -symbols 
    -s 
    从指定文件中读取符号表。 

    -se file 
    从指定文件中读取符号表信息,并把他用在可执行文件中。 

    -core 
    -c 
    调试时core dump的core文件。 

    -directory 
    -d 
    加入一个源文件的搜索路径。默认搜索路径是环境变量中PATH所定义的路径。 
    GDB的命令概貌 
          启动gdb后,就你被带入gdb的调试环境中,就可以使用gdb的命令开始调试程序了,gdb的命令可以使用help命令来查看,如下所示: 
    /home/hchen> gdb 
    GNU gdb 5.1.1 
    Copyright 2002 Free Software Foundation, Inc. 
    GDB is free software, covered by the GNU General Public License, and you are 
    welcome to change it and/or distribute copies of it under certain conditions. 
    Type "show copying" to see the conditions. 
    There is absolutely no warranty for GDB. Type "show warranty" for details. 
    This GDB was configured as "i386-suse-linux". 
    (gdb) help 
    List of classes of commands: 

    aliases -- Aliases of other commands 
    breakpoints -- Making program stop at certain points 
    data -- Examining data 
    files -- Specifying and examining files 
    internals -- Maintenance commands 
    obscure -- Obscure features 
    running -- Running the program 
    stack -- Examining the stack 
    status -- Status inquiries 
    support -- Support facilities 
    tracepoints -- Tracing of program execution without stopping the program 
    user-defined -- User-defined commands 

    Type "help" followed by a class name for a list of commands in that class. 
    Type "help" followed by command name for full documentation. 
    Command name abbreviations are allowed if unambiguous. 
    (gdb) 
          gdb的命令很多,gdb把之分成许多个种类。help命令只是例出gdb的命令种类,如果要看种类中的命令,可以使用help 命令,如:help breakpoints,查看设置断点的所有命令。也可以直接help 来查看命令的帮助。 
          gdb中,输入命令时,可以不用打全命令,只用打命令的前几个字符就可以了,当然,命令的前几个字符应该要标志着一个唯一的命令,在Linux下,你可以敲击两次TAB键来补齐命令的全称,如果有重复的,那么gdb会把其例出来。 

    示例一:在进入函数func时,设置一个断点。可以敲入break func,或是直接就是b func 
    (gdb) b func 
    Breakpoint 1 at 0x8048458: file hello.c, line 10. 
    示例二:敲入b按两次TAB键,你会看到所有b打头的命令: 
    (gdb) b 
    backtrace break bt 
    (gdb) 
    示例三:只记得函数的前缀,可以这样: 
    (gdb) b make_ <按TAB键> 
    (再按下一次TAB键,你会看到:) 
    make_a_section_from_file make_environ 
    make_abs_section make_function_type 
    make_blockvector make_pointer_type 
    make_cleanup make_reference_type 
    make_command make_symbol_completion_list 
    (gdb) b make_ 
    GDB把所有make开头的函数全部例出来给你查看。 
    示例四:调试C++的程序时,有可以函数名一样。如: 
    (gdb) b 'bubble( M-? 
    bubble(double,double) bubble(int,int) 
    (gdb) b 'bubble( 
    你可以查看到C++中的所有的重载函数及参数。(注:M-?和“按两次TAB键”是一个意思) 

    要退出gdb时,只用发quit或命令简称q就行了。 


    更详细的见下面的网址 
    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/guowake/archive/2008/03/21/2202138.aspx 
    linux下的gdb调core file有点困难,原因是linux下的core文件不像solaris下的,是增强型的core文件,core 

    文件里直接带了调试信息。如果是linux的,要是优化的版本,那只能是大致定位到core的位置,因为涉及到优 

    化。步骤是先编一个debug版本的程序,然后运行gdb调试debug版本的程序,同时加载core file,运行以后敲 

    bt,可以看到core掉时候保存的堆栈信息,然后对照源码,大概定位位置 

    还有一种方法是直接加载core file,然后bt到堆栈信息,然后disassemble函数,通过反汇编代码来对应源代 

    码,这种方法需要的技巧要高一些,至少要熟悉汇编指令才行



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

    调试的话输入: gdb filename core 

    filename就是产生core文件的可执行文件 
    转载自: http://blog.china-pub.com/more.asp?name=uniware&id=35478 


    先看看我用的是个什么机器: 

    $ uname -a 
    Linux dev 2.4.21-9.30AXsmp #1 SMP Wed May 26 23:37:09 EDT 2004 i686 i686 i386 GNU/Linux 

    再看看默认的一些参数,注意core file size是个0,程序出错时不会产生core文件了。 

    $ ulimit -a 
    core file size (blocks, -c) 0 
    data seg size (kbytes, -d) unlimited 
    file size (blocks, -f) unlimited 
    max locked memory (kbytes, -l) 4 
    max memory size (kbytes, -m) unlimited 
    open files (-n) 2048 
    pipe size (512 bytes, -p) 8 
    stack size (kbytes, -s) 10240 
    cpu time (seconds, -t) unlimited 
    max user processes (-u) 7168 
    virtual memory (kbytes, -v) unlimited 

    写个简单的程序,看看core文件是不是会被产生。 

    $ more foo.c 

    #include 

    static void sub(void); 

    int main(void) 

        sub(); 
        return 0; 


    static void sub(void) 

        int *p = NULL; 

        /* derefernce a null pointer, expect core dump. */ 
        printf("%d", *p); 


    $ gcc -Wall -g foo.c 
    $ ./a.out 
    Segmentation fault 

    $ ls -l core.* 
    ls: core.*: No such file or directory 

    没有找到core文件,我们改改ulimit的设置,让它产生。1024是随便取的,要是core文件大于1024个块,就产生不出来了。 

    $ ulimit -c 1024 

    $ ulimit -a 
    core file size (blocks, -c) 1024 
    data seg size (kbytes, -d) unlimited 
    file size (blocks, -f) unlimited 
    max locked memory (kbytes, -l) 4 
    max memory size (kbytes, -m) unlimited 
    open files (-n) 2048 
    pipe size (512 bytes, -p) 8 
    stack size (kbytes, -s) 10240 
    cpu time (seconds, -t) unlimited 
    max user processes (-u) 7168 
    virtual memory (kbytes, -v) unlimited 

    $ ./a.out 
    Segmentation fault (core dumped) 
    $ ls -l core.* 
    -rw------- 1 uniware uniware 53248 Jun 30 17:10 core.9128 

    注意看上述的输出信息,多了个(core dumped)。确实产生了一个core文件,9128是该进程的PID。我们用GDB来看看这个core。 

    $ gdb --core=core.9128 
    GNU gdb Asianux (6.0post-0.20040223.17.1AX) 
    Copyright 2004 Free Software Foundation, Inc. 
    GDB is free software, covered by the GNU General Public License, and you are 
    welcome to change it and/or distribute copies of it under certain conditions. 
    Type "show copying" to see the conditions. 
    There is absolutely no warranty for GDB. Type "show warranty" for details. 
    This GDB was configured as "i386-asianux-linux-gnu". 
    Core was generated by `./a.out'. 
    Program terminated with signal 11, Segmentation fault. 
    #0 0x08048373 in ?? () 
    (gdb) bt 
    #0 0x08048373 in ?? () 
    #1 0xbfffd8f8 in ?? () 
    #2 0x0804839e in ?? () 
    #3 0xb74cc6b3 in ?? () 
    #4 0x00000000 in ?? () 

    此时用bt看不到backtrace,也就是调用堆栈,原来GDB还不知道符号信息在哪里。我们告诉它一下: 

    (gdb) file ./a.out 
    Reading symbols from ./a.out...done. 
    Using host libthread_db library "/lib/tls/libthread_db.so.1". 
    (gdb) bt 
    #0 0x08048373 in sub () at foo.c:17 
    #1 0x08048359 in main () at foo.c:8 

    此时backtrace出来了。 

    (gdb) l 
    8        sub(); 
    9        return 0; 
    10    } 
    11 
    12    static void sub(void) 
    13    { 
    14        int *p = NULL; 
    15 
    16        /* derefernce a null pointer, expect core dump. */ 
    17        printf("%d", *p); 
    (gdb) 


    先看core文件的名字: 
    ls core.* 
    比如是core.1122 
    那么命令为 
    gdb test core.1122 
    然后gdb会指出在程序运行到哪里崩溃的。
    引用 1 楼 xyrbj 的回复:
    一个调试示例 

    源程序:tst.c 

    代码: 
    1 #include 

    3 int func(int n) 
    4 { 
    5      int sum=0,i; 
    6      for(i=0; i 
    7      { 
    8          sum+=i; 
    9      } 
    10    return sum; 
    11 } 
    12 
    13 
    14 main() 
    15 { 
    16      int i; 
    17      long result = 0; 
    18      for(i=1; i <=100; i++) 
    19      { 
    20            result += i; 
    21      } 
    22 
    23      printf("result[1-100] = %d 
    ", result ); 
    24      printf("result[1-250] = %d 
    ", func(250) ); 
    25 } 


    编译生成执行文件:(Linux下) 
    hchen/test> cc -g tst.c -o tst 

    使用GDB调试: 

    代码: 
    hchen/test> gdb tst <---------- 启动GDB 
    GNU gdb 5.1.1 
    Copyright 2002 Free Software Foundation, Inc. 
    GDB is free software, covered by the GNU General Public License, and you are 
    welcome to change it and/or distribute copies of it under certain conditions. 
    Type "show copying" to see the conditions. 
    There is absolutely no warranty for GDB. Type "show warranty" for details. 
    This GDB was configured as "i386-suse-linux"... 
    (gdb) l <-------------------- l命令相当于list,从第一行开始例出原码。 
    1 #include 

    3 int func(int n) 
    4 { 
    5 int sum=0,i; 
    6 for(i=0; i 
    7 { 
    8 sum+=i; 
    9 } 
    10 return sum; 
    (gdb) <-------------------- 直接回车表示,重复上一次命令 
    11 } 
    12 
    13 
    14 main() 
    15 { 
    16 int i; 
    17 long result = 0; 
    18 for(i=1; i <=100; i++) 
    19 { 
    20 result += i; 
    (gdb) break 16 <-------------------- 设置断点,在源程序第16行处。 
    Breakpoint 1 at 0x8048496: file tst.c, line 16. 
    (gdb) break func <-------------------- 设置断点,在函数func()入口处。 
    Breakpoint 2 at 0x8048456: file tst.c, line 5. 
    (gdb) info break <-------------------- 查看断点信息。 
    Num Type Disp Enb Address What 
    1 breakpoint keep y 0x08048496 in main at tst.c:16 
    2 breakpoint keep y 0x08048456 in func at tst.c:5 
    (gdb) r <--------------------- 运行程序,run命令简写 
    Starting program: /home/hchen/test/tst 

    Breakpoint 1, main () at tst.c:17 <---------- 在断点处停住。 
    17 long result = 0; 
    (gdb) n <--------------------- 单条语句执行,next命令简写。 
    18 for(i=1; i <=100; i++) 
    (gdb) n 
    20 result += i; 
    (gdb) n 
    18 for(i=1; i <=100; i++) 
    (gdb) n 
    20 result += i; 
    (gdb) c <--------------------- 继续运行程序,continue命令简写。 
    Continuing. 
    result[1-100] = 5050 <----------程序输出。 

    Breakpoint 2, func (n=250) at tst.c:5 
    5 int sum=0,i; 
    (gdb) n 
    6 for(i=1; i <=n; i++) 
    (gdb) p i <--------------------- 打印变量i的值,print命令简写。 
    $1 = 134513808 
    (gdb) n 
    8 sum+=i; 
    (gdb) n 
    6 for(i=1; i <=n; i++) 
    (gdb) p sum 
    $2 = 1 
    (gdb) n 
    8 sum+=i; 
    (gdb) p i 
    $3 = 2 
    (gdb) n 
    6 for(i=1; i <=n; i++) 
    (gdb) p sum 
    $4 = 3 
    (gdb) bt <--------------------- 查看函数堆栈。 
    #0 func (n=250) at tst.c:5 
    #1 0x080484e4 in main () at tst.c:24 
    #2 0x400409ed in __libc_start_main () from /lib/libc.so.6 
    (gdb) finish <--------------------- 退出函数。 
    Run till exit from #0 func (n=250) at tst.c:5 
    0x080484e4 in main () at tst.c:24 
    24 printf("result[1-250] = %d 
    ", func(250) ); 
    Value returned is $6 = 31375 
    (gdb) c <--------------------- 继续运行。 
    Continuing. 
    result[1-250] = 31375 <----------程序输出。 

    Program exited with code 027. <--------程序退出,调试结束。 
    (gdb) q <--------------------- 退出gdb。 
    hchen/test> 


    好了,有了以上的感性认识,还是让我们来系统地认识一下gdb吧。 

    使用GDB 

          一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。如: 
    > cc -g hello.c -o hello 
    > g++ -g hello.cpp -o hello 
    如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。当你用-g把调试信息加入之后,并成功编译目标代码以后,让我们来看看如何用gdb来调试他。 

    启动GDB的方法有以下几种: 
    1、gdb 
    program也就是你的执行文件,一般在当然目录下。 
    2、gdb core 
    用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。 
    3、gdb 
    如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。 
          GDB启动时,可以加上一些GDB的启动开关,详细的开关可以用gdb -help查看。我在下面只例举一些比较常用的参数: 
    -symbols 
    -s 
    从指定文件中读取符号表。 

    -se file 
    从指定文件中读取符号表信息,并把他用在可执行文件中。 

    -core 
    -c 
    调试时core dump的core文件。 

    -directory 
    -d 
    加入一个源文件的搜索路径。默认搜索路径是环境变量中PATH所定义的路径。 
    GDB的命令概貌 
          启动gdb后,就你被带入gdb的调试环境中,就可以使用gdb的命令开始调试程序了,gdb的命令可以使用help命令来查看,如下所示: 
    /home/hchen> gdb 
    GNU gdb 5.1.1 
    Copyright 2002 Free Software Foundation, Inc. 
    GDB is free software, covered by the GNU General Public License, and you are 
    welcome to change it and/or distribute copies of it under certain conditions. 
    Type "show copying" to see the conditions. 
    There is absolutely no warranty for GDB. Type "show warranty" for details. 
    This GDB was configured as "i386-suse-linux". 
    (gdb) help 
    List of classes of commands: 

    aliases -- Aliases of other commands 
    breakpoints -- Making program stop at certain points 
    data -- Examining data 
    files -- Specifying and examining files 
    internals -- Maintenance commands 
    obscure -- Obscure features 
    running -- Running the program 
    stack -- Examining the stack 
    status -- Status inquiries 
    support -- Support facilities 
    tracepoints -- Tracing of program execution without stopping the program 
    user-defined -- User-defined commands 

    Type "help" followed by a class name for a list of commands in that class. 
    Type "help" followed by command name for full documentation. 
    Command name abbreviations are allowed if unambiguous. 
    (gdb) 
          gdb的命令很多,gdb把之分成许多个种类。help命令只是例出gdb的命令种类,如果要看种类中的命令,可以使用help 命令,如:help breakpoints,查看设置断点的所有命令。也可以直接help 来查看命令的帮助。 
          gdb中,输入命令时,可以不用打全命令,只用打命令的前几个字符就可以了,当然,命令的前几个字符应该要标志着一个唯一的命令,在Linux下,你可以敲击两次TAB键来补齐命令的全称,如果有重复的,那么gdb会把其例出来。 

    示例一:在进入函数func时,设置一个断点。可以敲入break func,或是直接就是b func 
    (gdb) b func 
    Breakpoint 1 at 0x8048458: file hello.c, line 10. 
    示例二:敲入b按两次TAB键,你会看到所有b打头的命令: 
    (gdb) b 
    backtrace break bt 
    (gdb) 
    示例三:只记得函数的前缀,可以这样: 
    (gdb) b make_ <按TAB键> 
    (再按下一次TAB键,你会看到:) 
    make_a_section_from_file make_environ 
    make_abs_section make_function_type 
    make_blockvector make_pointer_type 
    make_cleanup make_reference_type 
    make_command make_symbol_completion_list 
    (gdb) b make_ 
    GDB把所有make开头的函数全部例出来给你查看。 
    示例四:调试C++的程序时,有可以函数名一样。如: 
    (gdb) b 'bubble( M-? 
    bubble(double,double) bubble(int,int) 
    (gdb) b 'bubble( 
    你可以查看到C++中的所有的重载函数及参数。(注:M-?和“按两次TAB键”是一个意思) 

    要退出gdb时,只用发quit或命令简称q就行了。 


    更详细的见下面的网址 
    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/guowake/archive/2008/03/21/2202138.aspx 


    说的很详细。 


    gdb  程序名  core文件 

    然后执行 
    where 

    会告诉你在哪个文件哪行出错的。



    引文来源  怎样用GDB调试core文件
    展开全文
  • gdb 调试coredump文件过程: 第一步:首先需要一个进程的coredump文件,怎么搞出coredump文件呢? 1、 ps -fax|grep 进程名称 找到进程的pid 2、gdb -p pid 调试进程 3、gcore coredump名称 则生成core文件 第...

    gdb 调试coredump文件过程:

    第一步:首先需要一个进程的coredump文件,怎么搞出coredump文件呢?

    1、 ps -fax|grep                 进程名称 找到进程的pid

    2、gdb -p pid                     调试进程

    3、gcore coredump名称        则生成core文件

    第二步:找出coredump文件的应用程序

    1、gdb -c corefile   使用gdb调试core文件

    2、info auxv          索引31对应的是core文件的应用程序

    第三部:gdb使用应用程序调试coredump文件

    gdb  coredump应用程序  coredump文件     调试coredump文件 

     

    通过以上三步就可以调试coredump文件了

    通过以下命令调试coredump文件

    info threads 显示所有线程

    bt 显示线程堆栈信息

    thread thread_num   切换线程

    frame num  切换栈

    info r 显示当前帧的寄存器信息 (每一帧的寄存器信息都是不相同的)

     

    readelf应用coredump

    readelf -h 读取coredump文件头

    readelf -wl 读取应用程序debug_line

    readelf -wf 读取应用程序fde和cie信息

     

    转载于:https://www.cnblogs.com/wangjian8888/p/5950912.html

    展开全文
  • 第一步:首先需要一个进程的coredump文件,怎么...1、ps -fax|grep 进程名称 找到进程的pid2、gdb -p pid 调试进程3、gcore coredump名称 则生成core文件第二步:找出coredump文件的应用程序1、gdb -c corefile 使用...

    第一步:首先需要一个进程的coredump文件,怎么搞出coredump文件呢?

    1、 ps -fax|grep                 进程名称 找到进程的pid

    2、gdb -p pid                     调试进程

    3、gcore coredump名称        则生成core文件

    第二步:找出coredump文件的应用程序

    1、gdb -c corefile   使用gdb调试core文件

    2、info auxv          索引31对应的是core文件的应用程序

    第三部:gdb使用应用程序调试coredump文件

    gdb  coredump应用程序  coredump文件     调试coredump文件 

     

    通过以上三步就可以调试coredump文件了

    通过以下命令调试coredump文件

    info threads 显示所有线程

    bt 显示线程堆栈信息

    thread thread_num   切换线程

    frame num  切换栈

    info r 显示当前帧的寄存器信息 (每一帧的寄存器信息都是不相同的)

     

    readelf应用coredump

    readelf -h 读取coredump文件头

    readelf -wl 读取应用程序debug_line

    readelf -wf 读取应用程序fde和cie信息

    转载于:https://www.cnblogs.com/wxmdevelop/p/9236663.html

    展开全文
  • GDB调试多线程core文件

    2020-04-21 00:25:01
    core文件仅仅是一个内存映象(同时加上调试信息),主要是用来调试的,接下来我们通过一个案例观察怎么利用GDB调试core文件。 在命令行中键入 gdb <可执行文件> < core文件>: 进入gdb命令行中: ...
  • core文件仅仅是一个内存映象(同时加上调试信息),主要是用来调试的,接下来我们通过一个案例观察怎么利用GDB调试core文件。 在命令行中键入 gdb :  进入gdb命令行中:  键入 bt 可以查看程序终止...
  • Core dump 文件保存了一个进程异常终止之后的调试信息,能够提供给gdb。 我们通过在gdb中加载这样的core dump文件, 就相当于读取了程序刚刚异常终止的状态,从而把现场还原。 好好利用core dump,你就可以...
  • 由于该嵌入式设备本身不支持gdb,所以还是生成core文件,拿到虚拟机中进行调试 使用以下命令生成core文件ulimit -c ulimit -c unlimited echo "/opt/core.%e.%t" > /proc/sys/kernel/core_pattern cat /proc/...
  • 记录一次core文件调试

    2016-10-24 15:04:55
    今天发现服务器挂了,自己调试了一下core,只能知道是循环解包引起的,却不知道怎么看到底是哪个包,以及包的内容。就请教了下阿里云的同学,他帮我处理了问题。做下笔记:  1.gdb /home/titan2/engine/bin/...
  • 利用gdb调试coredump

    2019-09-24 02:04:32
    1) core文件限制的大小,如果要生成的core文件超过设定的Core文件大小,则无法生成。 2) 编译的过程中需要使用 -g 参数。把调试信息加入到可执行文件。 修改core限制的大小命令: ulimit -c unlimited 转载于:...
  • 模拟 core dump 例子 用gdb查看core文件 总结gdb调试流程 详细视频讲解教程 GCC是GUN编译器集合(GNU Compiler Collection)可以编译C、C++、JAVA等语言 gcc是C编译器(GCC中的GUN C Compiler) g++是C++编译器(GCC中的...
  • Linux 下打core并调试core

    千次阅读 2013-11-26 15:46:52
    我们在Linux下工作时,经常会挺别人说程序崩溃了,会打出一个 core 文件在当前目录下,那个是怎么做到的呢?首先,我们需要看看自己的系统有没有开启 core 的开关,如果没有,我们需要开启,方法有很多,我就不在...
  • GDB core调试

    2016-11-15 21:17:30
    在程序发生core dump之后, 会生成对应程序的core文件,那怎么通过core文件查看错误信息呢? 用gdb查看core文件:gdb [exec file] [core file] 如: gdb ./test test.core 在进入gdb后, 用bt命令查看backtrace以检查...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 138
精华内容 55
关键字:

怎么调试core文件