真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

linux堆棧打印命令 linux如何打堆棧命令

c語言如何將函數(shù)調(diào)用堆棧打印出來

可以直接用輸出在函數(shù)內(nèi)部調(diào)用時(shí),把調(diào)用順序打印出來。

我們提供的服務(wù)有:成都網(wǎng)站制作、網(wǎng)站建設(shè)、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、平桂ssl等。為成百上千企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的平桂網(wǎng)站制作公司

一、一個(gè)由C/C++編譯的程序占用的內(nèi)存分為以下幾個(gè)部分

1、棧區(qū)(stack)—?由編譯器自動分配釋放?,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。

2、堆區(qū)(heap)?—?一般由程序員分配釋放,?若程序員不釋放,程序結(jié)束時(shí)可能由OS回收?。注意它與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事,分配方式倒是類似于鏈表,呵呵。

3、全局區(qū)(靜態(tài)區(qū))(static)—,全局變量和靜態(tài)變量的存儲是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,?未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。?-?程序結(jié)束后有系統(tǒng)釋放

4、文字常量區(qū)?—常量字符串就是放在這里的。?程序結(jié)束后由系統(tǒng)釋放

5、程序代碼區(qū)—存放函數(shù)體的二進(jìn)制代碼。

二、例程:

//main.cpp?

int?a?=?0;?全局初始化區(qū)?

char?*p1;?全局未初始化區(qū)?

main()?

{?

int?b;?棧?

char?s[]?=?"abc";?棧?

char?*p2;?棧?

char?*p3?=?"123456";?123456在常量區(qū),p3在棧上。?

static?int?c?=0;?全局(靜態(tài))初始化區(qū)?

p1?=?(char?*)malloc(10);?

p2?=?(char?*)malloc(20);?

分配得來得10和20字節(jié)的區(qū)域就在堆區(qū)。?

strcpy(p1,?"123456");?123456放在常量區(qū),編譯器可能會將它與p3所指向的"123456"優(yōu)化成一個(gè)地方。?

}

linux cpu使用率過高排查

方法一

第一步:使用

top命令,然后按shift+p按照CPU排序

找到占用CPU過高的進(jìn)程的pid

第二步:使用

top -H -p [進(jìn)程id]

找到進(jìn)程中消耗資源最高的線程的id

第三步:使用

echo 'obase=16;[線程id]' | bc或者printf "%x\n" [線程id]?

將線程id轉(zhuǎn)換為16進(jìn)制(字母要小寫)

bc是linux的計(jì)算器命令

第四步:執(zhí)行

jstack [進(jìn)程id] |grep -A 10 [線程id的16進(jìn)制]”

查看線程狀態(tài)信息

方法二

第一步:使用

top命令,然后按shift+p按照CPU排序

找到占用CPU過高的進(jìn)程

第二步:使用

ps -mp pid -o THREAD,tid,time | sort -rn

獲取線程信息,并找到占用CPU高的線程

第三步:使用

echo 'obase=16;[線程id]' | bc或者printf "%x\n" [線程id]

將需要的線程ID轉(zhuǎn)換為16進(jìn)制格式

第四步:使用

jstack pid |grep tid -A 30 [線程id的16進(jìn)制]

打印線程的堆棧信息

案例分析

場景描述

生產(chǎn)環(huán)境下JAVA進(jìn)程高CPU占用故障排查

解決過程

1、根據(jù)top命令,發(fā)現(xiàn)PID為2633的Java進(jìn)程占用CPU高達(dá)300%,出現(xiàn)故障。

2、找到該進(jìn)程后,如何定位具體線程或代碼呢,首先顯示線程列表,并按照CPU占用高的線程排序:

1

[root@localhost ~]# ps -mp 2633 -o THREAD,tid,time | sort -rn

顯示結(jié)果如下:

找到了耗時(shí)最高的線程(TID)3626,占用CPU時(shí)間有12分鐘了!

3、將需要的線程TID轉(zhuǎn)換為16進(jìn)制格式

12

[root@localhost ~]# printf "%x\n" 3626e18

4、最后使用jstack命令打印出該進(jìn)程下面的此線程的堆棧信息:

1

[root@localhost ~]# jstack 2633 |grep "e18" -A 30

相比故障的解決而言,發(fā)現(xiàn)故障也同等的重要!市場上的大多數(shù)監(jiān)控軟件都能實(shí)現(xiàn)服務(wù)器負(fù)載的實(shí)時(shí)觀測,比如:Zabbix、Nagios、阿里云監(jiān)控(針對云服務(wù)器)等。但是當(dāng)中大部分的軟件都需要運(yùn)維同學(xué)主動去設(shè)置規(guī)則或者檢測才能發(fā)現(xiàn)問題,如何被動的也能收到告警呢?

推薦大家一個(gè)實(shí)用的運(yùn)維軟件——王教授,對于業(yè)務(wù)部署在阿里云上的用戶,只需綁定需要監(jiān)控的只讀AcessKey,即可將云上資源的告警信息及時(shí)通知給對應(yīng)的團(tuán)隊(duì)成員。

化主動為被動的方式,一方面減輕了運(yùn)維工程師的工作,另一方面也減小了運(yùn)維漏看或者忽略告警的情況發(fā)生。

kill-3生成的線程堆棧怎么查看

第一步:在終端運(yùn)行Java程序

第二步:通過命令 pidof java 找到已經(jīng)啟動的java進(jìn)程的ID,選擇需要查看的java程序的進(jìn)程ID

第三步:使用命令 kill -3 java進(jìn)行的 pid 打印出java程序的線程堆棧信息

第四步:通常情況下運(yùn)行的項(xiàng)目可能會比較大,那么這個(gè)時(shí)候打印的堆棧信息可能會有幾千到幾萬行,為了方便查看,我們往往需要將輸出內(nèi)容進(jìn)行重定向

使用linux下的重定向命令方式即可:例如: demo.sh run.log 21 將輸出信息重定向到 run.log中。

注:在操作系統(tǒng)中,0 1 2分別對應(yīng)著不同的含義, 如下:

0 : 標(biāo)準(zhǔn)輸入,即:C中的stdin , java中的System.in

1 : 標(biāo)準(zhǔn)輸出, 即:C中的stdout ,java中的System.out

2 : 錯(cuò)誤輸出, 即:C中的stderr , java中的System.err

Demo:

----------------------------------------------------------------------------------------------

Sources Code :

public class PrintThreadTrace {

Object obj1 = new Object();

Object obj2 = new Object();

public void func1(){

synchronized (obj1){

func2();

}

}

public void func2(){

synchronized (obj2){

while(true){

System.out.print("");

}

}

}

public static void main(String[] args){

PrintThreadTrace ptt = new PrintThreadTrace();

ptt.func1();

}

}

----------------------------------------------------------------------------------------------------------------

按照步驟操作后的打印輸出信息:

Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.79-b02 mixed mode):

"Service Thread" daemon prio=10 tid=0x00007fdc880a9000 nid=0x12a4 runnable [0x0000000000000000]

java.lang.Thread.State: RUNNABLE

"C2 CompilerThread1" daemon prio=10 tid=0x00007fdc880a7000 nid=0x12a3 waiting on condition [0x0000000000000000]

java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" daemon prio=10 tid=0x00007fdc880a4000 nid=0x12a2 waiting on condition [0x0000000000000000]

java.lang.Thread.State: RUNNABLE

"JDWP Command Reader" daemon prio=10 tid=0x00007fdc50001000 nid=0x1299 runnable [0x0000000000000000]

java.lang.Thread.State: RUNNABLE

"JDWP Event Helper Thread" daemon prio=10 tid=0x00007fdc880a1800 nid=0x1298 runnable [0x0000000000000000]

java.lang.Thread.State: RUNNABLE

"JDWP Transport Listener: dt_socket" daemon prio=10 tid=0x00007fdc8809e000 nid=0x1297 runnable [0x0000000000000000]

java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" daemon prio=10 tid=0x00007fdc88091000 nid=0x1296 waiting on condition [0x0000000000000000]

java.lang.Thread.State: RUNNABLE

"Finalizer" daemon prio=10 tid=0x00007fdc88071800 nid=0x1295 in Object.wait() [0x00007fdc77ffe000]

java.lang.Thread.State: WAITING (on object monitor)

at java.lang.Object.wait(Native Method)

- waiting on 0x00000000ecb04858 (a java.lang.ref.ReferenceQueue$Lock)

at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)

- locked 0x00000000ecb04858 (a java.lang.ref.ReferenceQueue$Lock)

at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)

at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)

"Reference Handler" daemon prio=10 tid=0x00007fdc8806f800 nid=0x1294 in Object.wait() [0x00007fdc7c10b000]

java.lang.Thread.State: WAITING (on object monitor)

at java.lang.Object.wait(Native Method)

- waiting on 0x00000000ecb04470 (a java.lang.ref.Reference$Lock)

at java.lang.Object.wait(Object.java:503)

at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)

- locked 0x00000000ecb04470 (a java.lang.ref.Reference$Lock)

"main" prio=10 tid=0x00007fdc8800b800 nid=0x128e runnable [0x00007fdc8fef7000]

java.lang.Thread.State: RUNNABLE

at com.wenchain.study.PrintThreadTrace.func2(PrintThreadTrace.java:20)

- locked 0x00000000ecc04b20 (a java.lang.Object)

at com.wenchain.study.PrintThreadTrace.func1(PrintThreadTrace.java:13)

- locked 0x00000000ecc04b10 (a java.lang.Object)

at com.wenchain.study.PrintThreadTrace.main(PrintThreadTrace.java:27)

"VM Thread" prio=10 tid=0x00007fdc8806b000 nid=0x1293 runnable

"GC task thread#0 (ParallelGC)" prio=10 tid=0x00007fdc88021000 nid=0x128f runnable

"GC task thread#1 (ParallelGC)" prio=10 tid=0x00007fdc88023000 nid=0x1290 runnable

"GC task thread#2 (ParallelGC)" prio=10 tid=0x00007fdc88024800 nid=0x1291 runnable

"GC task thread#3 (ParallelGC)" prio=10 tid=0x00007fdc88026800 nid=0x1292 runnable

"VM Periodic Task Thread" prio=10 tid=0x00007fdc880b3800 nid=0x12a5 waiting on condition

JNI global references: 1391

Heap

PSYoungGen total 17920K, used 1270K [0x00000000ecb00000, 0x00000000ede80000, 0x0000000100000000)

eden space 15872K, 8% used [0x00000000ecb00000,0x00000000ecc3d898,0x00000000eda80000)

from space 2048K, 0% used [0x00000000edc80000,0x00000000edc80000,0x00000000ede80000)

to space 2048K, 0% used [0x00000000eda80000,0x00000000eda80000,0x00000000edc80000)

ParOldGen total 39424K, used 0K [0x00000000c6200000, 0x00000000c8880000, 0x00000000ecb00000)

object space 39424K, 0% used [0x00000000c6200000,0x00000000c6200000,0x00000000c8880000)

PSPermGen total 21504K, used 2619K [0x00000000c1000000, 0x00000000c2500000, 0x00000000c6200000)

object space 21504K, 12% used [0x00000000c1000000,0x00000000c128edd8,0x00000000c2500000)

----------------------------------------------------------------------------------------------------------------------------

上面的信息中包含了當(dāng)前JVM中所有運(yùn)行的線程信息,其中在示例中我們啟動的線程為main線程,其余的都是JVM自己創(chuàng)建的。

在打印的信息中,我們可以清楚的看見當(dāng)前線程的調(diào)用上下文,可以很清楚的知道程序的運(yùn)行情況。

并且我們在最后面還能看見當(dāng)前虛擬機(jī)中的內(nèi)存使用情況,青年世代,老年世代的信息等等...

PS: 在JDK1.5以上,我們可以通過在Java程序中調(diào)用Thread.getStackTrace()方法來進(jìn)行堆棧的自動打印,使得線程堆棧的打印時(shí)機(jī)可編程控制。

文章知識點(diǎn)與官方知識檔案匹配

Java技能樹首頁概覽

89841 人正在系統(tǒng)學(xué)習(xí)中

點(diǎn)擊閱讀全文

打開CSDN,閱讀體驗(yàn)更佳

jstack-查看Java進(jìn)程的線程堆棧信息,鎖定高消耗資源代碼

jstack主要用來查看某個(gè)Java進(jìn)程內(nèi)的線程堆棧信息。語法格式如下: jstack[option]pid jstack[option]executable core jstack[option][server-id@]remote-hostname-or-ip 命令行參數(shù)選項(xiàng)說明如下: ...

011Java并發(fā)包018查看線程堆棧信息_執(zhí)筆未來的博客

java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1088) java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809) java.util.concurre...

最新發(fā)布 jstack -- java堆棧常用排查指令

jstack -- java堆棧常用排查指令

繼續(xù)訪問

熱門推薦 jstack 命令查看JAVA線程堆棧

JAVA堆棧信息實(shí)際生產(chǎn)中,可能由于開發(fā)以及測試未能全面覆蓋的代碼質(zhì)量、性能問題,而引致線程掛起甚至崩潰??赡芫托枰榭炊褩P畔砼挪閱栴}了。jps -lvmjps -lvm 用于查看當(dāng)前機(jī)器上運(yùn)行的java進(jìn)程。C:\Users\Administratorjps -lvm 7348 -Dosgi.requiredJavaVersion=1.8 -Dosgi.instance.area.defa

繼續(xù)訪問

Java多線程——查看線程堆棧信息

Java多線程——查看線程堆棧信息 摘要:本文主要介紹了查看線程堆棧信息的方法。 使用Thread類的getAllStackTraces()方法 方法定義 可以看到getAllStackTraces()方法的返回值是一個(gè)Map對象,key是Thread的實(shí)例,value是一個(gè)StackTraceElement實(shí)例數(shù)組: 1 public static MapThread, S...

繼續(xù)訪問

java堆棧常用排查指令

java 異常排查四板斧 1、查看java 堆棧線程信息 說明 jstack命令打印指定Java進(jìn)程、核心文件或遠(yuǎn)程調(diào)試服務(wù)器的Java線程的Java堆棧跟蹤信息。 對于每個(gè)Java框架,完整的類名,方法名, 字節(jié)碼索引(BCI)和行號(如果有的話)被打印出來。 使用-m選項(xiàng),jstack命令打印程序中所有線程的Java和本機(jī)幀 計(jì)數(shù)器(PC)。 對于每個(gè)本機(jī)幀,當(dāng)可用時(shí),將打印離PC最近的本機(jī)符號。 c++亂碼的名字不會被修改。 要demangle c++名稱,輸出這個(gè) 命令可以管道到c++filt。 當(dāng)

繼續(xù)訪問

java診斷工具-Arthas(thread命令)查看當(dāng)前線程堆棧

cpu使用率與linux 命令top -H -p pid的線程CPU類似 1、支持一鍵展示當(dāng)前最忙的前N個(gè)線程并打印堆棧 thread -n 3 沒有線程ID,包含[Internal]表示為JVM內(nèi)部線程,參考dashboard命令的介紹。 cpuUsage為采樣間隔時(shí)間內(nèi)線程的CPU使用率,與dashboard命令的數(shù)據(jù)一致。 deltaTime為采樣間隔時(shí)間內(nèi)線程的增量CPU時(shí)間,小于1ms時(shí)被取整顯示為0ms。 time線程運(yùn)行總CPU...

繼續(xù)訪問

java查看線程的堆棧信息

通過使用jps 命令獲取需要監(jiān)控的進(jìn)程的pid,然后使用jstackpid 命令查看線程的堆棧信息。 通過jstack命令可以獲取當(dāng)前進(jìn)程的所有線程信息。 每個(gè)線程堆中信息中,都可以查看到線程ID、線程的狀態(tài)(wait、sleep、running 等狀態(tài))、是否持有鎖信息等。 jstack -l pid jvm_listlocks.txt 轉(zhuǎn)...

繼續(xù)訪問

java 查看線程堆棧信息_Java多線程——查看線程堆棧信息

java多線程——查看線程堆棧信息摘要:本文主要介紹了查看線程堆棧信息的方法。使用thread類的getallstacktraces()方法方法定義可以看到getallstacktraces()方法的返回值是一個(gè)map對象,key是thread的實(shí)例,value是一個(gè)stacktraceelement實(shí)例數(shù)組:1 public static map getallstacktraces()使用可以使...

繼續(xù)訪問

java線程堆棧信息分析

java堆棧信息分析

繼續(xù)訪問

java 查看堆棧_javap 命令查看堆棧中信息

javap命令是對.java文件進(jìn)行反編譯,通過這個(gè)命令可以看到堆棧中是怎么壓棧和出棧的已經(jīng)執(zhí)行順序,這里簡單解釋下javap的簡單的使用,下面舉個(gè)例子:題目:i++ 和++i的區(qū)別解釋:簡單點(diǎn)說 這個(gè)問題都不難回答,這里就不說了,但是實(shí)際上堆棧中區(qū)別也是老大了(這里就用到了javap命令), 步驟:1.在任意一個(gè)盤下面建一個(gè)名為Test.java的文件(文件名可以隨意命名)代碼如下:public...

繼續(xù)訪問

java 查看線程堆棧信息_jstack-查看Java進(jìn)程的線程堆棧信息,鎖定高消耗資源代碼。...

jstack主要用來查看某個(gè)Java進(jìn)程內(nèi)的線程堆棧信息。語法格式如下:jstack[option]pidjstack[option]executablecorejstack[option][server-id@]remote-hostname-or-ip命令行參數(shù)選項(xiàng)說明如下:-llonglistings,會打印出額外的鎖信息,在發(fā)生死鎖時(shí)可以用jstack-lpid來觀察...

繼續(xù)訪問

java堆棧信息怎么看_線程堆棧信息怎么看? - cs_person的個(gè)人空間 - OSCHINA - 中文開源技術(shù)交流社區(qū)...

一條線程堆棧信息大概長成下面這個(gè)樣子:RMI TCP Connection(267865)-172.16.5.25" daemon prio=10 tid=0x00007fd508371000 nid=0x55ae waiting for monitor entry [0x00007fd4f8684000]java.lang.Thread.State: BLOCKED (on object m...

繼續(xù)訪問

線程堆棧信息怎么看?

一條線程堆棧信息大概長成下面這個(gè)樣子: RMI TCP Connection(267865)-172.16.5.25" daemon prio=10 tid=0x00007fd508371000 nid=0x55ae waiting for monitor entry [0x00007fd...

繼續(xù)訪問

java的棧和堆

棧與堆都是Java用來在Ram中存放數(shù)據(jù)的地方。與C++不同,Java自動管理?xiàng):投?,程序員不能直接地設(shè)置?;蚨?。 Java 的堆是一個(gè)運(yùn)行時(shí)數(shù)據(jù)區(qū),類的(對象從中分配空間。這些對象通過new、newarray、anewarray和multianewarray等指令建立,它們不需要程序代碼來顯式的釋放。堆是由垃圾回收來負(fù)責(zé)的,堆的優(yōu)勢是可以動態(tài)地分配內(nèi)存大小,生存期也不必事先告訴編譯器,因?yàn)樗窃?..

繼續(xù)訪問

查看java線程_【JAVA】Java線程堆棧信息查看

如何獲得線程的堆棧信息?線上服務(wù)器cpu 100%了,該如何排查問題?1.top命令查詢哪個(gè)pid進(jìn)程占用cpu高(ps -ef|grep java 獲取PID號)2.通過 top -Hp pid 可以查看該進(jìn)程下各個(gè)線程的cpu使用情況,獲取占用cpu高的線程id3.執(zhí)行命令:printf "%X\n" 線程tid(用于獲取占用cpu高的線程id的16進(jìn)制數(shù))4.執(zhí)行命令:jstack pid ...

繼續(xù)訪問

kill -3 java_kill -3 PID命令獲取java應(yīng)用堆棧信息

一、應(yīng)用場景:當(dāng)linux服務(wù)器出現(xiàn)異常情況(響應(yīng)緩慢,負(fù)載持續(xù)飆升)并且服務(wù)器沒有安裝對應(yīng)的包而無法使用jstack等命令時(shí),可以使用linux的kill相關(guān)命令打印堆棧信息。命令格式:kill -3 PID二、執(zhí)行步驟:2.1、獲取java進(jìn)程的PIDps -ef|grep java結(jié)果的第二列數(shù)字就是進(jìn)程對應(yīng)的pid。2.2、kill -3 PID(1)如果項(xiàng)目通過Tomcat進(jìn)行發(fā)布(普通...

繼續(xù)訪問

jstack 工具 查看JVM堆棧信息

1|0介紹 jstack是java虛擬機(jī)自帶的一種堆棧跟蹤工具。jstack用于打印出給定的java進(jìn)程ID或corefile或遠(yuǎn)程調(diào)試服務(wù)的Java堆棧信息,如果是在64位機(jī)器上,需要指定選項(xiàng)"-J-d64",Windows的jstack使用方式只支持以下的這種方式: jstack [-l] pid 主要分為兩個(gè)功能: a. 針對活著的進(jìn)程做本地的或遠(yuǎn)程的線程dump; b. 針對core文件做線程dump。 jstack用于生成java虛擬機(jī)當(dāng)前時(shí)刻的線程快照。線程快照是...

繼續(xù)訪問

linux查看java堆棧

1、查看JAVA進(jìn)程JVM參數(shù) jinfo -flags pid(進(jìn)程號) -XX:CICompilerCount=2 最大的并行編譯數(shù) -XX:InitialHeapSize=16777216 JVM 的初始堆內(nèi)存大小 -XX:MaxHeapSize=257949696 JVM 的最大堆內(nèi)存大小 -XX:MaxNewSize=85983232 -XX:MinHeapDeltaBytes=196608 -XX:NewSize=5570560 -XX:OldSize=11206656 2、JVM 查看.

繼續(xù)訪問

Linux 如何查看一個(gè)進(jìn)程的堆棧

有兩種方法:第一種:pstack 進(jìn)程ID第二種,使用gdb 然后attach 進(jìn)程ID,然后再使用命令 thread apply all bt 兩種方法都可以列出進(jìn)程所有的線程的當(dāng)前的調(diào)用棧。不過,使用gdb的方法,還可以查看某些信息,例如局部變量,指針等。不過,如果只看調(diào)用棧的話,pstack還是很方便的。

繼續(xù)訪問

JAVA獲取堆棧信息

1. 通過Throwable獲取 StackTraceElement[] stackTrace = new Throwable().getStackTrace(); 2. 通過Thread獲取 StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();

繼續(xù)訪問

java 查看線程棧大小_基于 Java 線程棧的問題排查

除日志外,還有沒有別的方式跟蹤線上服務(wù)問題呢?或者,跟蹤并排除日志里無法發(fā)現(xiàn)的問題?方法當(dāng)然是有的,就是通過現(xiàn)場快照定位并發(fā)現(xiàn)問題。我們所說的現(xiàn)場,主要指這兩方面:Java 線程棧。線程棧是Java線程工作的快照,可以獲得當(dāng)前線程在做什么;Java 內(nèi)存堆。堆是JVM的內(nèi)存快照,可以獲取內(nèi)存分配相關(guān)信息。

linux print命令

具體參數(shù)及講解如下:

print命令的格式是:

print xxx

p xxx

1. print 操作符

@

是一個(gè)和數(shù)組有關(guān)的操作符,在后面會有更詳細(xì)的說明。

::

指定一個(gè)在文件或是一個(gè)函數(shù)中的變量。

{}

表示一個(gè)指向內(nèi)存地址的類型為type的一個(gè)對象。

2. 察看內(nèi)容

全局變量(所有文件可見的)

靜態(tài)全局變量(當(dāng)前文件可見的)

局部變量(當(dāng)前Scope可見的)

如果你的局部變量和全局變量發(fā)生沖突(也就是重名),一般情況下是局部變量會隱藏全局變量。如果此時(shí)你想查看全局變量的值時(shí),你可以使用“::”操作符:

file::variable

function::variable

eg:

查看文件f2.c中的全局變量x的值:

gdb) p 'f2.c'::x

注:如果你的程序編譯時(shí)開啟了優(yōu)化選項(xiàng),那么在用GDB調(diào)試被優(yōu)化過的程序時(shí),可能會發(fā)生某些變量不能訪問,或是取值錯(cuò)誤碼的情況。對付這種情況時(shí),需要在編譯程序時(shí)關(guān)閉編譯優(yōu)化。GCC,你可以使用“-gstabs” 選項(xiàng)來解決這個(gè)問題。

3. 察看數(shù)組

(1)動態(tài)數(shù)組:

p *array@len

array:數(shù)組的首地址,len:數(shù)據(jù)的長度

eg:

(gdb) p *array@len

$1 = {2, 4, 6, 8, 10}

(2)靜態(tài)數(shù)組

可以直接用print數(shù)組名,就可以顯示數(shù)組中所有數(shù)據(jù)的內(nèi)容了。

4. 輸出格式

x 按十六進(jìn)制格式顯示變量。

d 按十進(jìn)制格式顯示變量。

u 按十六進(jìn)制格式顯示無符號整型。

o 按八進(jìn)制格式顯示變量。

t 按二進(jìn)制格式顯示變量。

a 按十六進(jìn)制格式顯示變量。

c 按字符格式顯示變量。

f 按浮點(diǎn)數(shù)格式顯示變量。

eg:

(gdb) p i

$21 = 101

(gdb) p/a i

$22 = 0x65

(gdb) p/c i

$23 = 101 'e'

5. 察看內(nèi)存

使用examine(簡寫x)來查看內(nèi)存地址中的值。語法:

x/

n、f、u是可選的參數(shù)。

(1)n 是一個(gè)正整數(shù),表示顯示內(nèi)存的長度,也就是說從當(dāng)前地址向后顯示幾個(gè)地址的內(nèi)容。

(2)f 表示顯示的格式,參見上面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。

(3)u 表示從當(dāng)前地址往后請求的字節(jié)數(shù),如果不指定的話,GDB默認(rèn)是4個(gè)bytes。u參數(shù)可以用下面的字符來代替,b表示單字節(jié),h表示雙字節(jié),w表示四字 節(jié),g表示八字節(jié)。當(dāng)我們指定了字節(jié)長度后,GDB會從指內(nèi)存定的內(nèi)存地址開始,讀寫指定字節(jié),并把其當(dāng)作一個(gè)值取出來。

eg:

x/3uh 0x54320 :從內(nèi)存地址0x54320讀取內(nèi)容,h表示以雙字節(jié)為一個(gè)單位,3表示三個(gè)單位,u表示按十六進(jìn)制顯示。

6. 察看寄存器

(1)要查看寄存器的值,很簡單,可以使用如下命令:

info registers

(2)查看寄存器的情況。(除了浮點(diǎn)寄存器)

info all-registers

(3)查看所有寄存器的情況。(包括浮點(diǎn)寄存器)

info registers

(4)查看所指定的寄存器的情況。

寄存器中放置了程序運(yùn)行時(shí)的數(shù)據(jù),比如程序當(dāng)前運(yùn)行的指令地址(ip),程序的當(dāng)前堆棧地址(sp)等等。你同樣可以使用print命令來訪問寄存器的情況,只需要在寄存器名字前加一個(gè)$符號就可以了。如:p $eip。

7. display自動顯示的變量

(1)格式:display[/i|s] [expression | addr]

eg:

display/i $pc

$pc是GDB的環(huán)境變量,表示著指令的地址,/i則表示輸出格式為機(jī)器指令碼,也就是匯編。于是當(dāng)程序停下后,就會出現(xiàn)源代碼和機(jī)器指令碼相對應(yīng)的情形,這是一個(gè)很有意思的功能。

(2)其他

undisplay

delete display

刪除自動顯示,dnums意為所設(shè)置好了的自動顯式的編號。如果要同時(shí)刪除幾個(gè),編號可以用空格分隔,如果要?jiǎng)h除一個(gè)范圍內(nèi)的編號,可以用減號表示(如:2-5)

disable display

enable display

disable和enalbe不刪除自動顯示的設(shè)置,而只是讓其失效和恢復(fù)。

info display

查看display設(shè)置的自動顯示的信息。GDB會打出一張表格,向你報(bào)告當(dāng)然調(diào)試中設(shè)置了多少個(gè)自動顯示設(shè)置,其中包括,設(shè)置的編號,表達(dá)式,是否enable。

8. 設(shè)置

(1)set print address

set print address on

打開地址輸出,當(dāng)程序顯示函數(shù)信息時(shí),GDB會顯出函數(shù)的參數(shù)地址。

(2)set print array

set print array on

打開數(shù)組顯示,打開后當(dāng)數(shù)組顯示時(shí),每個(gè)元素占一行,如果不打開的話,每個(gè)元素則以逗號分隔。

(3)set print elements

這個(gè)選項(xiàng)主要是設(shè)置數(shù)組的,如果你的數(shù)組太大了,那么就可以指定一個(gè)來指定數(shù)據(jù)顯示的最大長度,當(dāng)?shù)竭_(dá)這個(gè)長度時(shí),GDB就不再往下顯示了。如果設(shè)置為0,則表示不限制。

(4)set print null-stop

如果打開了這個(gè)選項(xiàng),那么當(dāng)顯示字符串時(shí),遇到結(jié)束符則停止顯示。這個(gè)選項(xiàng)默認(rèn)為off。

(5)set print pretty on

如果打開printf pretty這個(gè)選項(xiàng),那么當(dāng)GDB顯示結(jié)構(gòu)體時(shí)會比較漂亮。如:

$1 = {

next = 0x0,

flags = {

sweet = 1,

sour = 1

},

meat = 0x54 "Pork"

}

(6)set print union

設(shè)置顯示結(jié)構(gòu)體時(shí),是否顯式其內(nèi)的聯(lián)合體數(shù)據(jù)。

(7)set print object

在C++中,如果一個(gè)對象指針指向其派生類,如果打開這個(gè)選項(xiàng),GDB會自動按照虛方法調(diào)用的規(guī)則顯示輸出,如果關(guān)閉這個(gè)選項(xiàng)的話,GDB就不管虛函數(shù)表了。


網(wǎng)站名稱:linux堆棧打印命令 linux如何打堆棧命令
網(wǎng)頁鏈接:http://weahome.cn/article/hhdsep.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部