linux列印堆棧
Ⅰ 怎麼解決 linux 堆棧溢出內存的問題
Valgrind 是一款 Linux下(支持 x86、x86_64和ppc32)程序的內存調試工具,它可以對編譯後的二進製程序進行內存使用監測(c語言中的 malloc 和 free,以及 C++ 中的 new 和 delete),找出內存泄漏問題。
Valgrind 中包含的 Memcheck 工具可以檢查以下的程序錯誤:
使用未初始化的內存 (Use of uninitialised memory)
使用已經釋放了的內存 (Reading/writing memory after it has been free』d)
使用超過 malloc 分配的內存空間(Reading/writing off the end of malloc』d blocks)
對堆棧的非法訪問(Reading/writing inappropriate areas on the stack)
申請的空間是否有釋放(Memory leaks – where pointers to malloc』d blocks are lost forever)
malloc/free/new/delete 申請和釋放內存的匹配(Mismatched use of malloc/new/new [] vs free/delete/delete [])
src 和 dst 的重疊(Overlapping src and dst pointers in memcpy() and related functions)
重復 free
① 編譯安裝 Valgrind:
# wget http://valgrind.org/downloads/valgrind-3.4.1.tar.bz2
# tar xvf valgrind-3.4.1.tar.bz2
# cd valgrind-3.4.1/
# ./configure
…………
Primary build target: X86_LINUX
Secondary build target:
Default
supp files: exp-ptrcheck.supp xfree-3.supp xfree-4.supp
glibc-2.X-drd.supp glibc-2.34567-NPTL-helgrind.supp glibc-2.5.supp
# make
# make install
# whereis valgrind
valgrind:
/usr/bin/valgrind
/usr/lib/valgrind
/usr/local/bin/valgrind
/usr/local/lib/valgrind
/usr/include/valgrind
/usr/share/man/man1/valgrind.1.gz
運行程序
使用示例:對「ls」程序進程檢查,返回結果中的「definitely lost: 0 bytes in 0 blocks.」表示沒有內存泄漏。
# /usr/local/bin/valgrind --tool=memcheck --leak-check=full ls /
==29801== Memcheck, a memory error detector.
==29801== Copyright (C) 2002-2008, and GNU GPL'd, by Julian Seward et al.
==29801== Using LibVEX rev 1884, a library for dynamic binary translation.
==29801== Copyright (C) 2004-2008, and GNU GPL'd, by OpenWorks LLP.
==29801== Using valgrind-3.4.1, a dynamic binary instrumentation framework.
==29801== Copyright (C) 2000-2008, and GNU GPL'd, by Julian Seward et al.
==29801== For more details, rerun with: -v
==29801==
bin etc lost+found mnt proc selinux sys usr
boot home media net root smokeping tftpboot var
dev lib misc opt sbin srv tmp
==29801==
==29801== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 21 from 1)
==29801== malloc/free: in use at exit: 14,744 bytes in 32 blocks.
==29801== malloc/free: 162 allocs, 130 frees, 33,758 bytes allocated.
==29801== For counts of detected errors, rerun with: -v
==29801== searching for pointers to 32 not-freed blocks.
==29801== checked 139,012 bytes.
==29801==
==29801== LEAK SUMMARY:
==29801== definitely lost: 0 bytes in 0 blocks.
==29801== possibly lost: 0 bytes in 0 blocks.
==29801== still reachable: 14,744 bytes in 32 blocks.
==29801== suppressed: 0 bytes in 0 blocks.
==29801== Reachable blocks (those to which a pointer was found) are not shown.
==29801== To see them, rerun with: --leak-check=full --show-reachable=yes
---------------------------------------------------------------------------------------------------------------
# /usr/local/bin/valgrind --tool=memcheck --leak-check=full ps /
==29898== Memcheck, a memory error detector.
==29898== Copyright (C) 2002-2008, and GNU GPL'd, by Julian Seward et al.
==29898== Using LibVEX rev 1884, a library for dynamic binary translation.
==29898== Copyright (C) 2004-2008, and GNU GPL'd, by OpenWorks LLP.
==29898== Using valgrind-3.4.1, a dynamic binary instrumentation framework.
==29898== Copyright (C) 2000-2008, and GNU GPL'd, by Julian Seward et al.
==29898== For more details, rerun with: -v
==29898==
ERROR: Garbage option.
********* simple selection ********* ********* selection by list *********
-A all processes -C by command name
-N negate selection -G by real group ID (supports names)
-a all w/ tty except session leaders -U by real user ID (supports names)
-d all except session leaders -g by session OR by effective group name
-e all processes -p by process ID
T all processes on this terminal -s processes in the sessions given
a all w/ tty, including other users -t by tty
g OBSOLETE -- DO NOT USE -u by effective user ID (supports names)
r only running processes U processes for specified users
x processes w/o controlling ttys t by tty
*********** output format ********** *********** long options ***********
-o,o user-defined -f full --Group --User --pid --cols --ppid
-j,j job control s signal --group --user --sid --rows --info
-O,O preloaded -o v virtual memory --cumulative --format --deselect
-l,l long u user-oriented --sort --tty --forest --version
-F extra full X registers --heading --no-heading --context
********* misc options *********
-V,V show version L list format codes f ASCII art forest
-m,m,-L,-T,H threads S children in sum -y change -l format
-M,Z security data c true command name -c scheling class
-w,w wide output n numeric WCHAN,UID -H process hierarchy
==29898==
==29898== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 14 from 1)
==29898== malloc/free: in use at exit: 16 bytes in 2 blocks.
==29898== malloc/free: 20 allocs, 18 frees, 2,344 bytes allocated.
==29898== For counts of detected errors, rerun with: -v
==29898== searching for pointers to 2 not-freed blocks.
==29898== checked 263,972 bytes.
==29898==
==29898== 8 bytes in 1 blocks are definitely lost in loss record 2 of 2
==29898== at 0x4005A88: malloc (vg_replace_malloc.c:207)
==29898== by 0xBFF6DF: strp (in /lib/libc-2.5.so)
==29898== by 0x804A464: (within /bin/ps)
==29898== by 0x804A802: (within /bin/ps)
==29898== by 0x804964D: (within /bin/ps)
==29898== by 0xBA5E8B: (below main) (in /lib/libc-2.5.so)
==29898==
==29898== LEAK SUMMARY:
==29898== definitely lost: 8 bytes in 1 blocks.
==29898== possibly lost: 0 bytes in 0 blocks.
==29898== still reachable: 8 bytes in 1 blocks.
==29898== suppressed: 0 bytes in 0 blocks.
==29898== Reachable blocks (those to which a pointer was found) are not shown.
==29898== To see them, rerun with: --leak-check=full --show-reachable=yes
Ⅱ 請問在linux下如何將kill -3 PID的輸出結果(該進程的堆棧信息)獲取到文件
如果只是調試記錄目的,測試下 script 命令
Ⅲ linux上程序溢出了 怎麼查看堆棧
我暈, 你到底是在什麼發行版? 從提示上來看,要用 apt-get install 來裝,說明是 ubuntu/debian之類的linux發行版,你怎麼又會去用 rpm 來查詢和安裝? 你不說你是什麼發行版,樓上回答的人也不管,直接就讓你用rpm,誤人子弟啊。正確的方法是,sudo apt-get install build-essential這個才是你的系統應該用的,裝好後命令行下運行gcc -v就會列印出你使用gcc的版本信息了,然後就可以用了,比如gcc -o test test.c就會編譯test.c,生成可執行文件 test然後./test就會運行test 我再暈,樓主,提示你沒有test.c,你的C源文件呢?我這里是用test.c做例子,你的源文件叫什麼名字,你就把test.c換成你的文件的名字啊。另外,你要把你的源文件先保存在linux機器上,比方說放到了 /home/yourname/aaa那你要先cd /home/yourname/aaa然後再gcc -o test test.c
Ⅳ 如何用Jstack把java進程中的堆棧信息輸出到
1.2 Thread Dump特點
1. 能在各種操作系統下使用
2. 能在各種Java應用伺服器下使用
3. 可以在生產環境下使用而不影響系統的性能
4. 可以將問題直接定位到應用程序的代碼行上
1.3 Thread Dump 能診斷的問題
1. 查找內存泄露,常見的是程序里load大量的數據到緩存;
2. 發現死鎖線程;
1.4如何抓取Thread Dump
一般當伺服器掛起,崩潰或者性能底下時,就需要抓取伺服器的線程堆棧(Thread Dump)用於後續的分析. 在實際運行中,往往一次 mp的信息,還不足以確認問題。為了反映線程狀態的動態變化,需要接連多次做threadmp,每次間隔10-20s,建議至少產生三次 mp信息,如果每次 mp都指向同一個問題,我們才確定問題的典型性。
有很多方式可用於獲取ThreadDump, 下面列出一部分獲取方式:
操作系統命令獲取ThreadDump:
Windows:
1.轉向伺服器的標准輸出窗口並按下Control + Break組合鍵, 之後需要將線程堆棧復制到文件中;
UNIX/ Linux:
首先查找到伺服器的進程號(process id), 然後獲取線程堆棧.
1. ps –ef | grep java
2. kill -3 <pid>
注意:一定要謹慎, 一步不慎就可能讓伺服器進程被殺死。kill -9 命令會殺死進程。
Ⅳ linux print命令
具體參數及講解如下:
print命令的格式是:
print xxx
p xxx
1. print 操作符
@
是一個和數組有關的操作符,在後面會有更詳細的說明。
::
指定一個在文件或是一個函數中的變數。
{}
表示一個指向內存地址的類型為type的一個對象。
2. 察看內容
全局變數(所有文件可見的)
靜態全局變數(當前文件可見的)
局部變數(當前Scope可見的)
如果你的局部變數和全局變數發生沖突(也就是重名),一般情況下是局部變數會隱藏全局變數。如果此時你想查看全局變數的值時,你可以使用「::」操作符:
file::variable
function::variable
eg:
查看文件f2.c中的全局變數x的值:
gdb) p 'f2.c'::x
註:如果你的程序編譯時開啟了優化選項,那麼在用GDB調試被優化過的程序時,可能會發生某些變數不能訪問,或是取值錯誤碼的情況。對付這種情況時,需要在編譯程序時關閉編譯優化。GCC,你可以使用「-gstabs」 選項來解決這個問題。
3. 察看數組
(1)動態數組:
p *array@len
array:數組的首地址,len:數據的長度
eg:
(gdb) p *array@len
$1 = {2, 4, 6, 8, 10}
(2)靜態數組
可以直接用print數組名,就可以顯示數組中所有數據的內容了。
4. 輸出格式
x 按十六進制格式顯示變數。
d 按十進制格式顯示變數。
u 按十六進制格式顯示無符號整型。
o 按八進制格式顯示變數。
t 按二進制格式顯示變數。
a 按十六進制格式顯示變數。
c 按字元格式顯示變數。
f 按浮點數格式顯示變數。
eg:
(gdb) p i
$21 = 101
(gdb) p/a i
$22 = 0x65
(gdb) p/c i
$23 = 101 'e'
5. 察看內存
使用examine(簡寫x)來查看內存地址中的值。語法:
x/
n、f、u是可選的參數。
(1)n 是一個正整數,表示顯示內存的長度,也就是說從當前地址向後顯示幾個地址的內容。
(2)f 表示顯示的格式,參見上面。如果地址所指的是字元串,那麼格式可以是s,如果地十是指令地址,那麼格式可以是i。
(3)u 表示從當前地址往後請求的位元組數,如果不指定的話,GDB默認是4個bytes。u參數可以用下面的字元來代替,b表示單位元組,h表示雙位元組,w表示四字 節,g表示八位元組。當我們指定了位元組長度後,GDB會從指內存定的內存地址開始,讀寫指定位元組,並把其當作一個值取出來。
eg:
x/3uh 0x54320 :從內存地址0x54320讀取內容,h表示以雙位元組為一個單位,3表示三個單位,u表示按十六進制顯示。
6. 察看寄存器
(1)要查看寄存器的值,很簡單,可以使用如下命令:
info registers
(2)查看寄存器的情況。(除了浮點寄存器)
info all-registers
(3)查看所有寄存器的情況。(包括浮點寄存器)
info registers
(4)查看所指定的寄存器的情況。
寄存器中放置了程序運行時的數據,比如程序當前運行的指令地址(ip),程序的當前堆棧地址(sp)等等。你同樣可以使用print命令來訪問寄存器的情況,只需要在寄存器名字前加一個$符號就可以了。如:p $eip。
7. display自動顯示的變數
(1)格式:display[/i|s] [expression | addr]
eg:
display/i $pc
$pc是GDB的環境變數,表示著指令的地址,/i則表示輸出格式為機器指令碼,也就是匯編。於是當程序停下後,就會出現源代碼和機器指令碼相對應的情形,這是一個很有意思的功能。
(2)其他
undisplay
delete display
刪除自動顯示,dnums意為所設置好了的自動顯式的編號。如果要同時刪除幾個,編號可以用空格分隔,如果要刪除一個范圍內的編號,可以用減號表示(如:2-5)
disable display
enable display
disable和enalbe不刪除自動顯示的設置,而只是讓其失效和恢復。
info display
查看display設置的自動顯示的信息。GDB會打出一張表格,向你報告當然調試中設置了多少個自動顯示設置,其中包括,設置的編號,表達式,是否enable。
8. 設置
(1)set print address
set print address on
打開地址輸出,當程序顯示函數信息時,GDB會顯出函數的參數地址。
(2)set print array
set print array on
打開數組顯示,打開後當數組顯示時,每個元素佔一行,如果不打開的話,每個元素則以逗號分隔。
(3)set print elements
這個選項主要是設置數組的,如果你的數組太大了,那麼就可以指定一個來指定數據顯示的最大長度,當到達這個長度時,GDB就不再往下顯示了。如果設置為0,則表示不限制。
(4)set print null-stop
如果打開了這個選項,那麼當顯示字元串時,遇到結束符則停止顯示。這個選項默認為off。
(5)set print pretty on
如果打開printf pretty這個選項,那麼當GDB顯示結構體時會比較漂亮。如:
$1 = {
next = 0x0,
flags = {
sweet = 1,
sour = 1
},
meat = 0x54 "Pork"
}
(6)set print union
設置顯示結構體時,是否顯式其內的聯合體數據。
(7)set print object
在C++中,如果一個對象指針指向其派生類,如果打開這個選項,GDB會自動按照虛方法調用的規則顯示輸出,如果關閉這個選項的話,GDB就不管虛函數表了。
Ⅵ linux內核崩潰的堆棧怎麼能取到或者有什麼好的調試方法
最簡單的方法:
在內核中,printk可以列印調試信息(用法同printf),你在加代碼之前,中,後都列印調試信息看看。
Ⅶ c語言如何將函數調用堆棧列印出來
可以直接用輸出在函數內部調用時,把調用順序列印出來。
一、一個由C/C++編譯的程序佔用的內存分為以下幾個部分
1、棧區(stack)—由編譯器自動分配釋放,存放函數的參數值,局部變數的值等。其操作方式類似於數據結構中的棧。
2、堆區(heap)—一般由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收。注意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表,呵呵。
3、全局區(靜態區)(static)—,全局變數和靜態變數的存儲是放在一塊的,初始化的全局變數和靜態變數在一塊區域,未初始化的全局變數和未初始化的靜態變數在相鄰的另一塊區域。-程序結束後有系統釋放
4、文字常量區—常量字元串就是放在這里的。程序結束後由系統釋放
5、程序代碼區—存放函數體的二進制代碼。
二、常式:
//main.cpp
inta=0;全局初始化區
char*p1;全局未初始化區
main()
{
intb;棧
chars[]="abc";棧
char*p2;棧
char*p3="123456";123456在常量區,p3在棧上。
staticintc=0;全局(靜態)初始化區
p1=(char*)malloc(10);
p2=(char*)malloc(20);
分配得來得10和20位元組的區域就在堆區。
strcpy(p1,"123456");123456放在常量區,編譯器可能會將它與p3所指向的"123456"優化成一個地方。
}
Ⅷ linux應用中,在一個進程內如何獲取本進程內其它線程的堆棧信息、
先用ps看目前存在的所有進程的進程號,然後可以對具體進程採用以下這些操作:(11345就是對應具體的進程號)
只查看該進程:ps -ef | grep 11345
查看該進程打開的文件:lsof -p 11345
查看內存分配:lcat /proc/11345/maps
查看堆棧:pstack 11345
查看發出的系統調用:strace -p 11345
查看調用庫函數:ltrace -p 11345
Ⅸ 求教linux高手,如何將kill -3 PID所輸出的堆棧信息獲取到
用gdb啊,如果你開了「ulimit -c unlimited」 的話,應該生成core文件了
Ⅹ linux 如何列印某個內核線程某一時刻的棧
寫個內核模塊,如果內核有自己的調試工具也不錯。