【问题标题】:How to debug core file generated with perl?如何调试使用 perl 生成的核心文件?
【发布时间】:2018-08-03 12:50:10
【问题描述】:

我有一个从 perl 脚本文件创建的 abc.bin 文件。

现在如何调试使用此“abc.bin”生成的核心文件

通过做,

gdb abc.bin -c core_file 

我收到错误提示“不是可执行格式:文件格式无法识别”

是否有任何其他选项可以在 GDB 中调试此类文件,或者是否有任何其他工具可以这样做

编辑:

让我们忘记 abc.bin,有没有办法调试用 perl 文件生成的核心文件,我有一个导致核心转储的 abc.pl 文件,有没有办法用 abc.pl 调试这个核心?

编辑

abc.bin 的文件输出

ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), stripped

编辑:

“gdb abc.bin”的输出

<M> l1143425:/root # gdb /var/storage/cores/abc.bin.11413
GNU gdb (GDB; Astaro Security Gateway) 7.9.1
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-suse-linux".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://bugs.opensuse.org/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
[New LWP 11413]
Core was generated by `app_name [module_name]'.
Program terminated with signal SIGABRT, Aborted.
#0  0xf7733440 in __kernel_vsyscall ()
"/var/storage/cores/abc.bin.11413" is a core file.
Please specify an executable to debug.
(gdb) bt
#0  0xf7733440 in __kernel_vsyscall ()
#1  0xf754bbb0 in ?? ()
#2  0xf768f000 in ?? ()
#3  0xf754d4e5 in ?? ()
#4  0x00000006 in ?? ()
#5  0xffba33e0 in ?? ()
#6  0xf64b6185 in ?? ()
#7  0x00000000 in ?? ()
(gdb) f 2
#2  0xf768f000 in ?? ()
(gdb) list
No symbol table is loaded.  Use the "file" command.
(gdb)

编辑

场景:

  1. 我有一个 perl 文件,比如说 abc.pl
  2. 使用 perlapp 我正在将此 perl 文件转换为可执行文件,比如说 abc.bin
  3. 现在我将这个 abc.bin 作为一个简单的可执行文件运行,而不是使用 perl,那么现在可以使用 GDB 进行调试了吗?有没有其他的调试方式?

【问题讨论】:

  • “从 Perl 脚本创建的 bin 文件”是什么意思?它是可执行文件吗?如果有,是什么格式?您可以使用file abc.bin 获取有关内容的信息。核心文件是从哪里来的? abc.bin 可能是 Perl 脚本,核心文件是来自 Perl 解释器的核心转储吗?
  • @amon 使用 abc.pl 文件中的 perlapp 命令我正在生成 abc.bin,File 命令还为 abc.bin 提供二进制文件,核心文件在 abc.bin 运行时生成。
  • 回复:“文件命令也为 abc.bin 提供二进制文件”。 file 命令的确切输出是什么?
  • 您可以调试由可执行文件生成的核心文件。如果您运行/usr/bin/perl 来运行生成核心转储的脚本,则运行gdb /usr/bin/perl。如果您运行另一个可执行文件,那么它将是别的东西。如果你运行file core_file,它应该会告诉你可执行文件的名字。它说什么?
  • 感谢您的更新。现在,gdb 抱怨 "/var/storage/cores/abc.bin.11413" is a core file. Please specify an executable to debug. 所以,你可以运行 gdb,然后运行你运行的可执行文件,而不是运行核心文件的名称 gdb /var/storage/cores/abc.bin.11413?也许它叫abc.bin,也许它是app_name。在我们让 gdb 启动且没有错误消息后,我们可以考虑添加核心文件。

标签: linux perl gdb


【解决方案1】:

您缺少调试信息。我的 GDB 说:

› gdb /usr/bin/perl
GNU gdb (GDB; openSUSE Tumbleweed) 8.1
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-suse-linux".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://bugs.opensuse.org/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from /usr/bin/perl...Missing separate debuginfo for /usr/bin/perl
Try: zypper install -C "debuginfo(build-id)=33dd6e73e6f617df00f76a78a397b854f49d6df1"
(no debugging symbols found)...done.
(gdb) r -e CORE::dump
Starting program: /usr/bin/perl -e CORE::dump
Missing separate debuginfo for /lib64/ld-linux-x86-64.so.2
Try: zypper install -C "debuginfo(build-id)=d1f6bf237ba196265561924d1baaf522e036281f"
Missing separate debuginfo for /lib64/libm.so.6
Try: zypper install -C "debuginfo(build-id)=1fc13b3ef7db0024a3f401933c6da8b266a8e06c"
Missing separate debuginfo for /lib64/libdl.so.2
Try: zypper install -C "debuginfo(build-id)=b21e9d59d1465db80fa52e72a4803f1901202e6d"
Missing separate debuginfo for /lib64/libcrypt.so.1
Try: zypper install -C "debuginfo(build-id)=b043217f12c9950ff058956c57320d8b03cee06b"
Missing separate debuginfo for /lib64/libpthread.so.0
Try: zypper install -C "debuginfo(build-id)=b5ad7ea10e4e88d4e2cc038e5c3288bdea82e20b"
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
Missing separate debuginfo for /lib64/libc.so.6
Try: zypper install -C "debuginfo(build-id)=5926416cd74d1dfe53d37374041bca37ee80c598"

Program received signal SIGABRT, Aborted.
0x00007ffff705e367 in kill () from /lib64/libc.so.6

包功能解析为包名:glibc-debuginfo glibc-debugsource perl-base-debuginfo perl-debugsource

安装缺失的包后会有一个有意义的回溯:

› gdb /usr/bin/perl
GNU gdb (GDB; openSUSE Tumbleweed) 8.1
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-suse-linux".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://bugs.opensuse.org/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from /usr/bin/perl...Reading symbols from /usr/lib/debug/usr/bin/perl-5.26.2-1.4.x86_64.debug...done.
done.
(gdb) r -e CORE::dump
Starting program: /usr/bin/perl -e CORE::dump
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".

Program received signal SIGABRT, Aborted.
0x00007ffff705e367 in kill () at ../sysdeps/unix/syscall-template.S:78
78      T_PSEUDO (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS)
(gdb) bt full
#0  0x00007ffff705e367 in kill () at ../sysdeps/unix/syscall-template.S:78
No locals.
#1  0x00005555555a42e9 in Perl_my_unexec (my_perl=<optimized out>) at perl.c:3685
No locals.
#2  0x0000555555678554 in Perl_pp_goto (my_perl=0x555555956260) at pp_ctl.c:3082
        sp = <optimized out>
        retop = 0x0
        ix = <optimized out>
        cx = <optimized out>
        enterops = {0x0, 0xeda3fe532dabdd00, 0x555555712140 <arg_counts>, 0x5555559591e0, 0x555555956260, 0x7fffffffd458, 0x5555559758c0,
          0x555555956260, 0x555555956260, 0x5555556391e1 <Perl_sv_free2+97>, 0x5555559758c0, 0x555555956260, 0xffffffffffffffff,
          0x55555566945e <Perl_free_tmps+78>, 0x5555559758c0, 0x0, 0x1, 0x5555555a9efd <perl_parse+5165>, 0x555555956260, 0x0,
          0x555555582800 <xs_init>, 0x0, 0x0, 0x100000000000001, 0x7fefffffffffffff, 0x555555956980, 0x6400000000, 0x0, 0x0, 0x0,
          0x54552e45445f6564, 0x6500382d46, 0x0, 0x0, 0x0, 0x2020002020000000, 0x6, 0x405, 0x1, 0x21b6, 0x0, 0x103, 0x0, 0x1000, 0x0,
          0x5b59e189, 0x13c9eb00, 0x5b59e189, 0x13c9eb00, 0x5b59e189, 0x13c9eb00, 0x0, 0x0, 0x0, 0x0, 0x6e00000061, 0x0, 0x770000007c, 0x2,
          0x0, 0x0, 0x0, 0x0, 0x0}
        label = <optimized out>
        label_len = 0
        label_flags = <optimized out>
        do_dump = true
        must_have_label = 0x555555712332 "goto must have label"
#3  0x000055555562b1d6 in Perl_runops_standard (my_perl=0x555555956260) at run.c:42
        op = <optimized out>
#4  0x00005555555ab027 in S_run_body (oldscope=<optimized out>, my_perl=<optimized out>) at perl.c:2532
No locals.
#5  perl_run (my_perl=0x555555956260) at perl.c:2455
        oldscope = 1
        ret = <optimized out>
        cur_env = {je_prev = 0x5555559565e8, je_buf = {{__jmpbuf = {0, -4037406656558474170, 93824992421648, 140737488344128, 0, 0,
                -7877616891281744826, -4037406257967473594}, __mask_was_saved = 0, __saved_mask = {__val = {0, 0, 0, 0, 0, 0, 0, 0, 0,
                  17123809841394736384, 139637976727552, 93824996434528, 93824992421648, 17123809841394736384, 0, 0}}}}, je_ret = 0,
          je_mustcatch = false, je_old_delaymagic = 0}
        _p = <optimized out>
---Type <return> to continue, or q <return> to quit---
        _p = <optimized out>
#6  0x00005555555826f2 in main (argc=<optimized out>, argv=<optimized out>, env=<optimized out>) at perlmain.c:123
        exitstatus = <optimized out>
        i = <optimized out>

【讨论】:

    猜你喜欢
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 2011-07-01
    • 2011-08-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    相关资源
    最近更新 更多