Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ GDB核心转储:崩溃后恢复argc argv值_C++_Linux_Gdb_Coredump - Fatal编程技术网

C++ GDB核心转储:崩溃后恢复argc argv值

C++ GDB核心转储:崩溃后恢复argc argv值,c++,linux,gdb,coredump,C++,Linux,Gdb,Coredump,在应用程序崩溃后,是否可以恢复main的argv和argc参数的精确值 我只需要在Linux上使用应用程序核心转储和gdb调试器。看起来您需要从基础开始 使用-g标志编译应用程序代码,确保不删除它 如果我想编译hello.c gcc -c -g hello.c -o hello.o gcc hello.o -o hello 现在如果您不想调试 ulimit -c unlimited ./hello 当应用程序崩溃时,将生成一个核心文件 检查核心文件 "gdb ./hello core.$$$

在应用程序崩溃后,是否可以恢复main的argv和argc参数的精确值


我只需要在Linux上使用应用程序核心转储和gdb调试器。

看起来您需要从基础开始

使用-g标志编译应用程序代码,确保不删除它

如果我想编译hello.c

gcc -c -g hello.c -o hello.o
gcc hello.o -o hello
现在如果您不想调试

ulimit -c unlimited
./hello
当应用程序崩溃时,将生成一个核心文件

检查核心文件

"gdb ./hello core.$$$" this will list you your stack.
您还可以选择调试映像 gdb你好


互联网上有很多关于GDB的东西,请仔细阅读。

是的,如果应用程序是用调试信息编译的。在gdb中打开核心转储并找到包含main函数的框架。然后转到此框并打印argvargc的值。下面是示例gdb会话

[root@localhost ~]# gdb ./a.out core.2020
GNU gdb (GDB) 7.2
Copyright (C) 2010 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-pc-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /root/a.out...done.
[New Thread 2020]

warning: Can't read pathname for load map: Input/output error.
Reading symbols from /usr/lib/libstdc++.so.6...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/libstdc++.so.6
Reading symbols from /lib/libm.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/libm.so.6
Reading symbols from /lib/libgcc_s.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib/libgcc_s.so.1
Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/ld-linux.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib/ld-linux.so.2
Core was generated by `./a.out'.
Program terminated with signal 6, Aborted.
#0  0x0027b424 in __kernel_vsyscall ()
(gdb) bt
#0  0x0027b424 in __kernel_vsyscall ()
#1  0x00b28b91 in raise () from /lib/libc.so.6
#2  0x00b2a46a in abort () from /lib/libc.so.6
#3  0x007d3397 in __gnu_cxx::__verbose_terminate_handler() () from /usr/lib/libstdc++.so.6
#4  0x007d1226 in ?? () from /usr/lib/libstdc++.so.6
#5  0x007d1263 in std::terminate() () from /usr/lib/libstdc++.so.6
#6  0x007d13a2 in __cxa_throw () from /usr/lib/libstdc++.so.6
#7  0x08048940 in main (argv=1, argc=0xbfcf1754) at test.cpp:14
(gdb) f 7
#7  0x08048940 in main (argv=1, argc=0xbfcf1754) at test.cpp:14
14              throw std::runtime_error("123");
(gdb) p argv
$1 = 1
(gdb) p argc
$2 = (char **) 0xbfcf1754
(gdb)
[root@localhost~]#gdb./a.out core.2020
GNU gdb(gdb)7.2
版权所有(C)2010免费软件基金会。
许可证GPLv3+:GNU GPL版本3或更高版本
这是自由软件:您可以自由更改和重新发布它。
在法律允许的范围内,不存在任何担保。键入“显示复制”
和“显示保修”了解详细信息。
此GDB配置为“i686 pc linux gnu”。
有关错误报告说明,请参阅:
...
从/root/a.out读取符号…完成。
[新线程2020]
警告:无法读取加载映射的路径名:输入/输出错误。
正在从/usr/lib/libstdc++.so.6中读取符号…(未找到调试符号)…已完成。
为/usr/lib/libstdc++.so.6加载的符号
正在从/lib/libm.so.6读取符号…(未找到调试符号)…已完成。
为/lib/libm.so.6加载的符号
正在从/lib/libgcc_.so.1读取符号…(未找到调试符号)…已完成。
为/lib/libgcc_.so.1加载的符号
正在从/lib/libc.so.6读取符号…(未找到调试符号)…已完成。
为/lib/libc.so.6加载的符号
正在从/lib/ld linux.so.2读取符号…(未找到调试符号)…完成。
为/lib/ld linux.so.2加载的符号
核心由“./a.out”生成。
程序以信号6终止,中止。
#内核vsyscall()中的0 0x0027b424
(gdb)英国电信
#内核vsyscall()中的0 0x0027b424
#在/lib/libc.so.6的raise()中输入1 0x00b28b91
#2 0x00b2a46a位于/lib/libc.so.6中的abort()中
#3 0x007d3397,位于/usr/lib/libstdc++.so.6的
#4 0x007d1226英寸??()来自/usr/lib/libstdc++.so.6
#来自/usr/lib/libstdc++.so.6的std::terminate()中的5 0x007d1263
#来自/usr/lib/libstdc++.so.6的0x007d13a2 in_uuucxa_uthrow()
#测试时,主电源中有7个0x08048940(argv=1,argc=0xbfcf1754)。cpp:14
(gdb)f 7
#测试时,主电源中有7个0x08048940(argv=1,argc=0xbfcf1754)。cpp:14
14抛出std::运行时_错误(“123”);
(gdb)p argv
$1 = 1
(gdb)p argc
$2=(字符**)0xbfcf1754
(gdb)

最简单的方法是在执行任何其他操作之前,将
argc
argv
的值写入某个文件,如果您非常关心这些值,那么只需返回到main,您就可以执行
打印argc
x/4s*argv
或任何您想要的。也可以为非调试版本恢复argc和argv。如果这是OP真正想要的,我可以写出来。@Employed Russian:我很想知道!我有一个非调试核心转储,我想看到argv。@misterbee问这个问题,我会回答;-)请注意,答案是特定于体系结构的,因此一定要说
x86_64
,或
i686
,或其他任何内容。@