2011-08-10 28 views
2

在應用程序崩潰後,是否可以恢復主體的argv和argc參數的確切值?GDB核心轉儲:崩潰後恢復argc argv值

我只需要在Linux上使用應用程序core-dump和gdb調試器。

+0

最簡單的方法就是別人做任何事情之前寫argc'的'和一些文件中的值'argv',如果你那麼在乎他們 –

回答

1

看起來你需要從基礎開始..!

用-g標誌編譯你的應用程序代碼,確保你不要去掉它。

說,如果我想編譯的hello.c

gcc -c -g hello.c -o hello.o 
gcc hello.o -o hello 

現在如果你不想調試

ulimit -c unlimited 
./hello 

當應用程序崩潰wiil生成一個核心文件。

要檢查覈心文件

"gdb ./hello core.$$$" this will list you your stack. 

,你也可以選擇調試圖像 GDB你好

有超過約GDB互聯網了很多東西,也通過他們去。

+0

是的,剛上去,通過回溯到主,你可以做'打印argc','x/4s * argv'或任何你想要的。 – user786653

2

是的,如果應用程序編譯與調試信息。在gdb中打開core dump並找到包含main函數的框架。然後轉到此框並輸出argvargc的值。這裏是示例gdb會話。

[[email protected] ~]# 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) 
+2

也可以爲非調試版本恢復argc和argv。如果這是OP真正需要的,我可以寫出來。 –

+0

@僱用俄語:我會有興趣知道!我有一個非調試核心轉儲,我想看看argv。 – misterbee

+0

@misterbee問這個問題,我會回答;-)請注意,答案是架構特定的,所以一定要說'x86_64',或'i686',或其他什麼。 –