梦回连营 发表于 2022-2-3 15:16:46

虚拟机ubuntu下gdb调试出现的问题

#include <iostream>

using namespace std;

int main(void) {
    cout << "hello world" << endl;
    return 0;
}

在使用gdb调试以上代码的时侯, 运行到最后一个花括号上出现了下列的报错信息,是怎么情况?



__libc_start_main (main=0x5555555551a9 <main()>, argc=1, argv=0x7fffffffdf98,
    init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>,
    stack_end=0x7fffffffdf88) at ../csu/libc-start.c:342
342        ../csu/libc-start.c: No such file or directory.


人造人 发表于 2022-2-3 16:07:00

你用的是单步步入指令 s 吧
这会在最后让程序停在调用 main 函数的下一条语句
main 函数是在 libc-start.c 文件中调用的,你用 s 指令就返回到这个文件了
一般 gcc 不提供这个文件,当然就找不到了
这不算是错误
你可以自己编译 gcc 的源代码,这个文件在 gcc 的源代码中
要在源代码级别调试库函数,你需要自己编译一个带源代码版本且不开优化的 gcc 编译器,当然还有依赖的库


# gdb main
GNU gdb (GDB) 10.2
Copyright (C) 2021 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-pc-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
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 main...
(gdb) b main
Breakpoint 1 at 0x4011ac: file main.cpp, line 6.
(gdb) r
Starting program: /tmp/main
warning: File "/usr/lib/libstdc++.so.6.0.29-gdb.py" auto-loading has been declined by your `auto-load safe-path' set to "$debugdir:$datadir/auto-load".
To enable execution of this file add
        add-auto-load-safe-path /usr/lib/libstdc++.so.6.0.29-gdb.py
line to your configuration file "/root/.gdbinit".
To completely disable this security protection add
        set auto-load safe-path /
line to your configuration file "/root/.gdbinit".
For more information about this security protection see the
"Auto-loading safe path" section in the GDB manual.E.g., run from the shell:
        info "(gdb)Auto-loading safe path"

Breakpoint 1, main () at main.cpp:6
6          cout << "hello world" << endl;
(gdb) n
hello world
7          return 0;
(gdb) s
8        }
(gdb) s
__libc_start_main (main=0x4011a8 <main()>, argc=1, argv=0x7fffffffeae8, init=0x401222 <__libc_csu_init>,
    fini=0x40129a <__libc_csu_fini>, rtld_fini=0x7ffff7fd32b6 <_dl_fini>, stack_end=0x7fffffffead8)
    at ../csu/libc-start.c:366
366          exit (result);
(gdb) l
361        #else
362          /* Nothing fancy, just call the function.*/
363          result = main (argc, argv, __environ MAIN_AUXVEC_PARAM);
364        #endif
365       
366          exit (result);
367        }
(gdb)

# gdb main
GNU gdb (GDB) 10.2
Copyright (C) 2021 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-pc-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
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 main...
(gdb) b main
Breakpoint 1 at 0x4011ac: file main.cpp, line 6.
(gdb) r
Starting program: /tmp/main
warning: File "/usr/lib/libstdc++.so.6.0.29-gdb.py" auto-loading has been declined by your `auto-load safe-path' set to "$debugdir:$datadir/auto-load".
To enable execution of this file add
        add-auto-load-safe-path /usr/lib/libstdc++.so.6.0.29-gdb.py
line to your configuration file "/root/.gdbinit".
To completely disable this security protection add
        set auto-load safe-path /
line to your configuration file "/root/.gdbinit".
For more information about this security protection see the
"Auto-loading safe path" section in the GDB manual.E.g., run from the shell:
        info "(gdb)Auto-loading safe path"

Breakpoint 1, main () at main.cpp:6
6          cout << "hello world" << endl;
(gdb) n
hello world
7          return 0;
(gdb) s
8        }
(gdb) s
__libc_start_main (main=0x4011a8 <main()>, argc=1, argv=0x7fffffffeae8, init=0x401222 <__libc_csu_init>,
    fini=0x40129a <__libc_csu_fini>, rtld_fini=0x7ffff7fd32b6 <_dl_fini>, stack_end=0x7fffffffead8)
    at ../csu/libc-start.c:366
366          exit (result);
(gdb) l
361        #else
362          /* Nothing fancy, just call the function.*/
363          result = main (argc, argv, __environ MAIN_AUXVEC_PARAM);
364        #endif
365       
366          exit (result);
367        }
(gdb) kill
Kill the program being debugged? (y or n) y

(gdb) b _start
Breakpoint 2 at 0x401090: file ../sysdeps/x86_64/start.S, line 63.
(gdb) r
Starting program: /tmp/main
warning: File "/usr/lib/libstdc++.so.6.0.29-gdb.py" auto-loading has been declined by your `auto-load safe-path' set to "$debugdir:$datadir/auto-load".

Breakpoint 2, _start () at ../sysdeps/x86_64/start.S:63
63                xorl %ebp, %ebp
(gdb) l
58        ENTRY (_start)
59                /* Clearing frame pointer is insufficient, use CFI.*/
60                cfi_undefined (rip)
61                /* Clear the frame pointer.The ABI suggests this be done, to mark
62                   the outermost frame obviously.*/
63                xorl %ebp, %ebp
64       
65                /* Extract the arguments as encoded on the stack and set up
66                   the arguments for __libc_start_main (int (*main) (int, char **, char **),
67                           int argc, char *argv,
(gdb) n
79                mov %RDX_LP, %R9_LP        /* Address of the shared library termination
(gdb)
85                popq %rsi                /* Pop the argument count.*/
(gdb)
88                mov %RSP_LP, %RDX_LP
(gdb)
90                and$~15, %RSP_LP
(gdb)
93                pushq %rax
(gdb)
97                pushq %rsp
(gdb)
101                mov __libc_csu_fini@GOTPCREL(%rip), %R8_LP
(gdb)
102                mov __libc_csu_init@GOTPCREL(%rip), %RCX_LP
(gdb)
104                mov main@GOTPCREL(%rip), %RDI_LP
(gdb)
120                call *__libc_start_main@GOTPCREL(%rip)
(gdb)

Breakpoint 1, main () at main.cpp:6
6          cout << "hello world" << endl;
(gdb) kill
Kill the program being debugged? (y or n) y

(gdb) r
Starting program: /tmp/main
warning: File "/usr/lib/libstdc++.so.6.0.29-gdb.py" auto-loading has been declined by your `auto-load safe-path' set to "$debugdir:$datadir/auto-load".

Breakpoint 2, _start () at ../sysdeps/x86_64/start.S:63
63                xorl %ebp, %ebp
(gdb) n
79                mov %RDX_LP, %R9_LP        /* Address of the shared library termination
(gdb)
85                popq %rsi                /* Pop the argument count.*/
(gdb)
88                mov %RSP_LP, %RDX_LP
(gdb)
90                and$~15, %RSP_LP
(gdb)
93                pushq %rax
(gdb)
97                pushq %rsp
(gdb)
101                mov __libc_csu_fini@GOTPCREL(%rip), %R8_LP
(gdb)
102                mov __libc_csu_init@GOTPCREL(%rip), %RCX_LP
(gdb)
104                mov main@GOTPCREL(%rip), %RDI_LP
(gdb)
120                call *__libc_start_main@GOTPCREL(%rip)
(gdb) s
__libc_start_main (main=0x4011a8 <main()>, argc=1, argv=0x7fffffffeae8, init=0x401222 <__libc_csu_init>,
    fini=0x40129a <__libc_csu_fini>, rtld_fini=0x7ffff7fd32b6 <_dl_fini>, stack_end=0x7fffffffead8)
    at ../csu/libc-start.c:248
248          if (__glibc_likely (rtld_fini != NULL))
(gdb) n
249          __cxa_atexit ((void (*) (void *)) rtld_fini, NULL, NULL);
(gdb)
275          if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0))
(gdb)
278          if (init)
(gdb)
279          (*init) (argc, argv, __environ MAIN_AUXVEC_PARAM);
(gdb)
283          if (__glibc_unlikely (GLRO(dl_naudit) > 0))
(gdb)
298          if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS))
(gdb)
318          not_first_call = setjmp ((struct __jmp_buf_tag *) unwind_buf.cancel_jmp_buf);
(gdb)
320          if (__glibc_likely (! not_first_call))
(gdb)
322              struct pthread *self = THREAD_SELF;
(gdb)
325              unwind_buf.priv.data.prev = THREAD_GETMEM (self, cleanup_jmp_buf);
(gdb)
326              unwind_buf.priv.data.cleanup = THREAD_GETMEM (self, cleanup);
(gdb)
329              THREAD_SETMEM (self, cleanup_jmp_buf, &unwind_buf);
(gdb)
332              result = main (argc, argv, __environ MAIN_AUXVEC_PARAM);
(gdb) s

Breakpoint 1, main () at main.cpp:6
6          cout << "hello world" << endl;
(gdb) n
hello world
7          return 0;
(gdb)
8        }
(gdb)
__libc_start_main (main=0x4011a8 <main()>, argc=1, argv=0x7fffffffeae8, init=0x401222 <__libc_csu_init>,
    fini=0x40129a <__libc_csu_fini>, rtld_fini=0x7ffff7fd32b6 <_dl_fini>, stack_end=0x7fffffffead8)
    at ../csu/libc-start.c:366
366          exit (result);
(gdb) l
361        #else
362          /* Nothing fancy, just call the function.*/
363          result = main (argc, argv, __environ MAIN_AUXVEC_PARAM);
364        #endif
365       
366          exit (result);
367        }
(gdb) n

(gdb)
页: [1]
查看完整版本: 虚拟机ubuntu下gdb调试出现的问题