0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GDB: core_analyzer

Last updated at Posted at 2018-05-25

core analyzer

https://sourceforge.net/projects/core-analyzer/files/Core%20Analyzer/ から、バージョン 2.16 がダウンロードできます。
わたしは、core_analyzer の Print General Core Information くらいしか利用した事がありませんが、core ファイルのメモリマップの把握として使っています。

出力例

$ ./core_analyzer /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.131.x86_64/bin/java ./core.*
Please input the address of variable main_arena
You can find it by command "(gdb)print &main_arena"
main_arena ? 0x3d82d8e120
Please input the address of variable mp_
You can find it by command "(gdb)print &mp_"
mp_ ? 0x3d82d90720
Warning: 56 mmap memory blocks were found while mp_ reports 16
******************************************************************
** Core Analyzer version 2.16                                   **
** Please report bugs to: Michael Yan (myan@gmail.com)          **
******************************************************************

Main Menu:
[0] Print General Core Information
[1] Find References to an Object (horizontal search)
[2] What Is This Address and Underlying Object Type (vertical search)
[3] Objects Shared Between Threads
[4] Memory Pattern Analysis
[5] Query Heap Memory Block
[6] Page Walk (check the integrity of surrounding memory blocks)
[7] Heap Walk (check the whole heap for corruption and memory usage stats)
[8] Biggest Heap Memory Blocks
[9] Biggest Heap Memory Owners(variables)
[10] Heap Memory Leak Candidates
[11] Quit
Select [0-11]: 0
NOTE
        [0] name: CORE type: PRPSINFO
                process_state=T
                filename=java [java -verbose UnloadableClassLoader /home/imai/Java/myapp.jar com.example.myapp.]
        [1] name: CORE type: PRSTATUS
                pid=4040 signal=0 user_time=0.0sec sys_time=0.0sec
                %rip=0x3d8320e82d %rsp=0x7f16681f31d0
        [2] name: CORE type: FPREGSET [fpregset struct]
                floating point register set
        [3] name: LINUX type: 514
        [4] name: CORE type: PRSTATUS
                pid=4041 signal=0 user_time=0.0sec sys_time=0.0sec
                %rip=0x3d8320b68c %rsp=0x7f166042a8a0
        [5] name: CORE type: FPREGSET [fpregset struct]
                floating point register set
        [6] name: LINUX type: 514
        [7] name: CORE type: PRSTATUS
                pid=4042 signal=0 user_time=0.0sec sys_time=0.0sec
                %rip=0x3d8320b68c %rsp=0x7f1660329920
        [8] name: CORE type: FPREGSET [fpregset struct]
                floating point register set
        [9] name: LINUX type: 514
        [10] name: CORE type: PRSTATUS
                pid=4043 signal=0 user_time=0.0sec sys_time=0.0sec
                %rip=0x3d8320ba5e %rsp=0x7f165d308870
        [11] name: CORE type: FPREGSET [fpregset struct]
                floating point register set
        [12] name: LINUX type: 514
        [13] name: CORE type: PRSTATUS
                pid=4044 signal=0 user_time=0.0sec sys_time=0.0sec
        [14] name: CORE type: FPREGSET [fpregset struct]
                floating point register set
        [15] name: LINUX type: 514
        [16] name: CORE type: PRSTATUS
                pid=4045 signal=0 user_time=0.0sec sys_time=0.0sec
                %rip=0x3d8320b68c %rsp=0x7f165d1064e0
        [17] name: CORE type: FPREGSET [fpregset struct]
                floating point register set
        [18] name: LINUX type: 514
        [19] name: CORE type: PRSTATUS
                pid=4046 signal=0 user_time=0.0sec sys_time=0.0sec
                %rip=0x3d8320da00 %rsp=0x7f165d005930
        [20] name: CORE type: FPREGSET [fpregset struct]
                floating point register set
        [21] name: LINUX type: 514
        [22] name: CORE type: PRSTATUS
                pid=4047 signal=0 user_time=0.0sec sys_time=0.0sec
                %rip=0x3d8320b68c %rsp=0x7f165cf04a30
        [23] name: CORE type: FPREGSET [fpregset struct]
                floating point register set
        [24] name: LINUX type: 514
        [25] name: CORE type: PRSTATUS
                pid=4048 signal=0 user_time=0.0sec sys_time=0.0sec
                %rip=0x3d8320b68c %rsp=0x7f165ce03ab0
        [26] name: CORE type: FPREGSET [fpregset struct]
                floating point register set
        [27] name: LINUX type: 514
        [28] name: CORE type: PRSTATUS
                pid=4049 signal=0 user_time=0.0sec sys_time=0.0sec
                %rip=0x3d8320b68c %rsp=0x7f165cd027c0
        [29] name: CORE type: FPREGSET [fpregset struct]
                floating point register set
        [30] name: LINUX type: 514
        [31] name: CORE type: PRSTATUS
                pid=4050 signal=0 user_time=0.0sec sys_time=0.0sec
                %rip=0x3d8320ba5e %rsp=0x7f165cc01910
        [32] name: CORE type: FPREGSET [fpregset struct]
                floating point register set
        [33] name: LINUX type: 514
        [34] name: CORE type: PRSTATUS
                pid=4039 signal=0 user_time=0.0sec sys_time=0.0sec
                %rip=0x3d832082fd %rsp=0x7ffe7bb92c30
        [35] name: CORE type: FPREGSET [fpregset struct]
                floating point register set
        [36] name: LINUX type: 514
        [37] name: CORE type: AUXV
                type=33
                type=16 hardware_capability=395049983
                type=6  pagesize=4096
                type=17 frequency_of_times()=100
                type=3  &phdr[0]=0x400040
                type=4  sizeof(phdr[0])=56
                type=5  #phdr_entries=8
                type=7  ld.so_base_addr=0x0
                type=8  proc_flags=0x0
                type=9  entry_point=0x400610
                type=11 real_uid=0
                type=12 effective_uid=0
                type=13 real_gid=0
                type=14 effective_gid=0
                type=23 was_exec_setuid-like? NO
                type=25
                type=31
                type=15 plat_name=0x7ffe7bb97279

No.                vaddr       memsz      filesz     perm    name
=================================================================
[  0]           0x600000        8192        8192      RW-   [ .data ]  [ /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.131.x86_64/bin/java ]
[  1]          0x14cc000      135168      135168      RW-   [ heap ]
[  2]         0xbea00000    53477376    53477376      RW-   [ heap ]
[  3]         0xc1d00000   120586240   120586240      RW-   [ unknown ]
[  4]         0xc9000000   212860928   212860928      RW-   [ .data ]  [ /lib64/libm.so.6 ]
[  5]         0xd5b00000   402128896   402128896      RW-   [ .data ]  [ /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.131.x86_64/jre/bin/../lib/amd64/jli/libjli.so ]
[  6]         0xeda80000   307757056   307757056      RW-   [ .data ]  [ /lib64/libpthread.so.0 ]
[  7]       0x3d8241f000        8192        8192      R--   [ .rodat]  [ /lib64/ld-linux-x86-64.so.2 ]
[  8]       0x3d82421000        4096        4096      RW-   [ unknown ]
[  9]       0x3d82422000        4096        4096      RW-   [ .data ]  [ /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.131.x86_64/bin/java ]
[ 10]       0x3d82802000        4096        4096      R--   [ .rodat]  [ /lib64/libdl.so.2 ]
[ 11]       0x3d82803000        4096        4096      RW-   [ unknown ]
[ 12]       0x3d82d8a000       16384       16384      R--   [ .rodat]  [ /lib64/libc.so.6 ]
[ 13]       0x3d82d8e000        8192        8192      RW-   [ unknown ]
[ 14]       0x3d82d90000       16384       16384      RW-   [ unknown ]
[ 15]       0x3d8300c000        4096        4096      RW-   [ .data ]  [ /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.131.x86_64/jre/bin/../lib/amd64/jli/libjli.so ]
[ 16]       0x3d83417000        4096        4096      R--   [ .rodat]  [ /lib64/libpthread.so.0 ]
[ 17]       0x3d83418000        4096        4096      RW-   [ unknown ]
[ 18]       0x3d83419000       16384       16384      RW-   [ unknown ]
[ 19]       0x3d83806000        4096        4096      R--   [ .rodat]  [ /lib64/librt.so.1 ]
[ 20]       0x3d83807000        4096        4096      RW-   [ unknown ]
[ 21]       0x3d83c15000        4096        4096      RW-   [ unknown ]
[ 22]       0x3d8c815000        4096        4096      RW-   [ .data ]  [ /lib64/libgcc_s.so.1 ]
[ 23]       0x3d8e0e8000       28672       28672      R--   [ .rodat]  [ /usr/lib64/libstdc++.so.6 ]
[ 24]       0x3d8e0ef000        8192        8192      RW-   [ unknown ]
[ 25]       0x3d8e0f1000       86016       86016      RW-   [ unknown ]
[ 26]     0x7f160c000000     4468736     4468736      RW-   [ heap ]
[ 27]     0x7f160c443000    62640128    62640128      R--   [ unknown ]
[ 28]     0x7f1614000000    66998272    66998272      RW-   [ heap ]
[ 29]     0x7f1617fe5000      110592      110592      R--   [ unknown ]
[ 30]     0x7f161c000000    67051520    67051520      RW-   [ heap ]
[ 31]     0x7f161fff2000       57344       57344      R--   [ unknown ]
[ 32]     0x7f1624000000    67076096    67076096      RW-   [ heap ]
[ 33]     0x7f1627ff8000       32768       32768      R--   [ unknown ]
[ 34]     0x7f1628000000    67043328    67043328      RW-   [ heap ]
[ 35]     0x7f162bff0000       65536       65536      R--   [ unknown ]
[ 36]     0x7f162c000000      135168      135168      RW-   [ heap ]
[ 37]     0x7f162c021000    66973696    66973696      R--   [ unknown ]
[ 38]     0x7f1630000000      135168      135168      RW-   [ heap ]
[ 39]     0x7f1630021000    66973696    66973696      R--   [ unknown ]
[ 40]     0x7f1634000000    12283904    12283904      RW-   [ heap ]
[ 41]     0x7f1634bb7000    54824960    54824960      R--   [ unknown ]
[ 42]     0x7f1638000000     9154560     9154560      RW-   [ heap ]
[ 43]     0x7f16388bb000    57954304    57954304      R--   [ unknown ]
[ 44]     0x7f163c000000      135168      135168      RW-   [ heap ]
[ 45]     0x7f163c021000    66973696    66973696      R--   [ unknown ]
[ 46]     0x7f1648000000      135168      135168      RW-   [ heap ]
[ 47]     0x7f1648021000    66973696    66973696      R--   [ unknown ]
[ 48]     0x7f164c000000      135168      135168      RW-   [ heap ]
[ 49]     0x7f164c021000    66973696    66973696      R--   [ unknown ]
[ 50]     0x7f1650000000     1060864     1060864      RW-   [ heap ]
[ 51]     0x7f1650103000    66048000    66048000      R--   [ unknown ]
[ 52]     0x7f1654000000      135168      135168      RW-   [ heap ]
[ 53]     0x7f1654021000    66973696    66973696      R--   [ unknown ]
[ 54]     0x7f1658000000      872448      872448      RW-   [ heap ]
[ 55]     0x7f16580d5000    66236416    66236416      R--   [ unknown ]
[ 56]     0x7f165cb02000        4096        4096      R--   [ unknown ]
[ 57]     0x7f165cb03000     1048576     1048576      RW-   [ stack ]  [ tid=11 ]
[ 58]     0x7f165cc03000       12288       12288      R--   [ unknown ]
[ 59]     0x7f165cc06000     1040384     1040384      RW-   [ stack ]  [ tid=10 ]
[ 60]     0x7f165cd04000       12288       12288      R--   [ unknown ]
[ 61]     0x7f165cd07000     1040384     1040384      RW-   [ stack ]  [ tid=9 ]
[ 62]     0x7f165ce05000       12288       12288      R--   [ unknown ]
[ 63]     0x7f165ce08000     1040384     1040384      RW-   [ stack ]  [ tid=8 ]
[ 64]     0x7f165cf06000       12288       12288      R--   [ unknown ]
[ 65]     0x7f165cf09000     1040384     1040384      RW-   [ stack ]  [ tid=7 ]
[ 66]     0x7f165d007000       12288       12288      R--   [ unknown ]
[ 67]     0x7f165d00a000     1040384     1040384      RW-   [ stack ]  [ tid=6 ]
[ 68]     0x7f165d108000       12288       12288      R--   [ unknown ]
[ 69]     0x7f165d10b000     1040384     1040384      RW-   [ stack ]  [ tid=5 ]
[ 70]     0x7f165d209000        4096        4096      R--   [ unknown ]
[ 71]     0x7f165d20a000    11231232    11231232      RW-   [ heap ]
[ 72]     0x7f165de76000    37437440    37437440      RW-   [ heap ]
[ 73]     0x7f166022a000        4096        4096      R--   [ unknown ]
[ 74]     0x7f166022b000     1048576     1048576      RW-   [ stack ]  [ tid=3 ]
[ 75]     0x7f166032b000        4096        4096      R--   [ unknown ]
[ 76]     0x7f166032c000     1155072     1155072      RW-   [ stack ]  [ tid=2 ]
[ 77]     0x7f1660446000      233472      233472      RW-   [ unknown ]
[ 78]     0x7f166047f000      417792      417792      RW-   [ unknown ]
[ 79]     0x7f16604e5000      786432      786432      RW-   [ unknown ]
[ 80]     0x7f16605a5000      106496      106496      RW-   [ unknown ]
[ 81]     0x7f16605bf000      233472      233472      RW-   [ unknown ]
[ 82]     0x7f16605f8000      417792      417792      RW-   [ unknown ]
[ 83]     0x7f166065e000      782336      782336      RW-   [ unknown ]
[ 84]     0x7f166071d000      602112      602112      RW-   [ unknown ]
[ 85]     0x7f16607b0000        4096        4096      RW-   [ unknown ]
[ 86]     0x7f16607b1000     2555904     2555904      RWX   [ unknown ]
[ 87]     0x7f1660a21000    47775744    47775744      RW-   [ unknown ]
[ 88]     0x7f16639b8000        4096        4096      RW-   [ .data ]  [ /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.131.x86_64/jre/lib/amd64/libzip.so ]
[ 89]     0x7f1663bc5000        4096        4096      R--   [ .rodat]  [ /lib64/libnss_files.so.2 ]
[ 90]     0x7f1663bc6000        4096        4096      RW-   [ unknown ]
[ 91]     0x7f1663def000        8192        8192      RW-   [ .data ]  [ /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.131.x86_64/jre/lib/amd64/libjava.so ]
[ 92]     0x7f1663ffe000        8192        8192      RW-   [ .data ]  [ /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.131.x86_64/jre/lib/amd64/libverify.so ]
[ 93]     0x7f1664000000    67104768    67104768      RW-   [ heap ]
[ 94]     0x7f1667fff000        4096        4096      R--   [ unknown ]
[ 95]     0x7f1668021000      126976      126976      RW-   [ unknown ]
[ 96]     0x7f1668040000      745472      745472      RW-   [ unknown ]
[ 97]     0x7f16680f6000       12288       12288      R--   [ unknown ]
[ 98]     0x7f16680f9000     1040384     1040384      RW-   [ stack ]  [ tid=1 ]
[ 99]     0x7f1668479000        4096        4096      R--   [ .rodat]  [ /lib64/libm.so.6 ]
[100]     0x7f166847a000        4096        4096      RW-   [ unknown ]
[101]     0x7f16691b9000      802816      802816      RW-   [ .data ]  [ /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.131.x86_64/jre/lib/amd64/server/libjvm.so ]
[102]     0x7f166927d000      204800      204800      RW-   [ unknown ]
[103]     0x7f16692c4000        4096        4096      RW-   [ unknown ]
[104]     0x7f16692c5000        4096        4096      R--   [ unknown ]
[105]     0x7f16692c6000        4096        4096      RW-   [ unknown ]
[106]     0x7ffe7bb84000       86016       86016      RW-   [ stack ]  [ tid=12 ]
[107]     0x7ffe7bba3000        4096        4096      R-X   [ unknown ]
[108] 0xffffffffff600000        4096        4096      R-X   [ unknown ]

Main Menu:
[0] Print General Core Information
[1] Find References to an Object (horizontal search)
[2] What Is This Address and Underlying Object Type (vertical search)
[3] Objects Shared Between Threads
[4] Memory Pattern Analysis
[5] Query Heap Memory Block
[6] Page Walk (check the integrity of surrounding memory blocks)
[7] Heap Walk (check the whole heap for corruption and memory usage stats)
[8] Biggest Heap Memory Blocks
[9] Biggest Heap Memory Owners(variables)
[10] Heap Memory Leak Candidates
[11] Quit
Select [0-11]: 

core_analyzer 2.16 のインストール

この投稿を書いている時点 2018.5.25 では 2.18 がありますが、RHEL 7 などでは、ライブラリが不足しているとのエラーで動作しません。
そのため旧バージョンですが core_analyzer 2.16 を使います。

# mkdir /work
# cd /work

まずは 7zip を適当なところからダウンロード&インストールします。

● RHEL 6
# wget https://www.mirrorservice.org/sites/dl.fedoraproject.org/pub/epel/6/x86_64/Packages/p/p7zip-16.02-10.el6.x86_64.rpm
# rpm -ivh p7zip-16.02-10.el6.x86_64.rpm 

● RHEL 7
# wget https://www.mirrorservice.org/sites/dl.fedoraproject.org/pub/epel/7/x86_64/Packages/p/p7zip-16.02-10.el7.x86_64.rpm
# rpm -ivh p7zip-16.02-10.el7.x86_64.rpm

core_analyzer_2.16 をダウンロード&展開します。
# wget https://jaist.dl.sourceforge.net/project/core-analyzer/Core%20Analyzer/core_analyzer_2_16.7z
# 7za x core_analyzer_2_16.7z
...
# chmod 755 ./core_analyzer_2_16/Linux/core_analyzer

core_analyzer にパッチをあてる

ソースコードからのコンパイルは面倒なので、手抜きですがバイナリにパッチをあて起動できるようにします。

# ./core_analyzer_2_16/Linux/core_analyzer /work/abc /work/core.1292
The memory manager of glibc 2.17 is not supported in this release
Fail to initialize core analyzer
# 

上記のとおりエラーで起動しないので、glibc のバージョンチェック部分にパッチをあてます。

# gdb -write -q ./core_analyzer_2_16/Linux/core_analyzer
...

(gdb) x/10i  0x40e8b9 
   0x40e8b9 <init_heap()+415>:  mov    0x20617d(%rip),%edx        # 0x614a3c <glibc_ver_minor>
   0x40e8bf <init_heap()+421>:  lea    -0x3(%rdx),%eax
   0x40e8c2 <init_heap()+424>:  cmp    $0x2,%eax
   0x40e8c5 <init_heap()+427>:  jbe    0x40e8eb <init_heap()+465>
   0x40e8c7 <init_heap()+429>:  cmp    $0xc,%edx
   0x40e8ca <init_heap()+432>:  je     0x40e8eb <init_heap()+465>
   0x40e8cc <init_heap()+434>:  mov    0x2061ae(%rip),%esi        # 0x614a80 <glibc_ver_major>
   0x40e8d2 <init_heap()+440>:  mov    $0x411c48,%edi
   0x40e8d7 <init_heap()+445>:  mov    $0x0,%eax
   0x40e8dc <init_heap()+450>:  callq  0x4012f8 <printf@plt>
(gdb) 
(gdb) set {unsigned char}0x40e8c4 = 0x11
(gdb) x/i 0x40e8c2
   0x40e8c2 <init_heap()+424>:  cmp    $0x11,%eax
(gdb) q

変更後、エラーは出ません。

# ./core_analyzer_2_16/Linux/core_analyzer /work/abc /work/core.1292
Please input the address of variable main_arena
You can find it by command "(gdb)print &main_arena"
main_arena ? 

変更している内容

./gdbplus/gdb-7.7/gdb/heap_ptmalloc.c
   1417         // Support a subset of all glibc versions
-  1418         if (glibc_ver_minor != 3
-  1419                 && glibc_ver_minor != 4
-  1420                 && glibc_ver_minor != 5
-  1421                 //&& glibc_ver_minor != 11
   1422                 && glibc_ver_minor != 12)
   1423         {
   1424                 CA_PRINT("The memory manager of glibc %d.%d is not supported in this release\n",
   1425                                 glibc_ver_major, glibc_ver_minor);
   1426                 return CA_FALSE;
   1427         }

たぶん上記が以下のように変更されたのと等価のはず???

+               if (glibc_ver_minor > 17 && 
                        && glibc_ver_minor != 12)
            

core_analyzer の実行

gdb で main_arena と mp_ を調べた後に実行します。

(gdb) p &main_arena
$1 = (<data variable, no debug info> *) 0x7f606ca34760 <main_arena>
(gdb) p &mp_
$2 = (<data variable, no debug info> *) 0x7f606ca341a0 <mp_>
(gdb)

確認しておいたアドレスを、 core_analyzer に入力

# ./core_analyzer_2_16/Linux/core_analyzer  /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64/bin/java /home/imai/Java/core.*
Please input the address of variable main_arena
You can find it by command "(gdb)print &main_arena"
main_arena ? 0x7f606ca34760
Please input the address of variable mp_
You can find it by command "(gdb)print &mp_"
mp_ ? 0x7f606ca341a0

最初に記載した出力が行われます。

健忘録としてと、また、何かのヒントになれば幸いです。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?