linux的使用者態程式棧的跟蹤方法

2021-07-13 14:41:57 字數 3073 閱讀 8587

將下面的**儲存為main.c檔案,然後用gcc編譯

#include 

#include

#include

/* obtain a backtrace and print it to stdout. */

void

print_trace (void)

/* a dummy function to make the backtrace more interesting. */

void

dummy_function (void)

intmain (void)

然後編譯並執行:

[ycwang@ycwang-desktop:backtrace-test]$ gcc -g main.c

[ycwang@ycwang-desktop:backtrace-test]$ ./a.out

obtained 5 stack frames.

./a.out() [0x4006fe]

./a.out() [0x400795]

./a.out() [0x4007a1]

/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0) [0x7f06a6ef2ac0]

./a.out() [0x400609]

可以看到,程式執行之後,把stack frames完全列印出來了。

我們可以定位各個棧了。

然後用objdump來把反彙編檔案匯出到乙個檔案中

[ycwang@ycwang-desktop:backtrace-test]$ objdump -d a.out > dump

然後開啟dump檔案,查詢函式在記憶體中的虛擬位址。

450

00000000004006d6 :

4514006d6: 55

push

%rbp

4524006d7: 48

89 e5 mov %rsp,%rbp

4534006da: 48

83 c4 80 add $0xffffffffffffff80,%rsp

4544006de: 64

488b 04

2528

00 mov %fs:0x28,%rax

4554006e5: 00

00456

4006e7: 48

8945 f8 mov %rax,-0x8(%rbp)

4574006eb: 31 c0

xor%eax,%eax

4584006ed: 48

8d 45 a0 lea -0x60(%rbp),%rax

4594006f1: be 0a 00

0000 mov $0xa,%esi

4604006f6: 48

89 c7 mov %rax,%rdi

4614006f9: e8 92 fe ff ff callq 400590

@plt>

4624006fe: 48

98 cltq

463400700: 48

8945

90 mov %rax,-0x70(%rbp)

464400704: 48

8b 45

90 mov -0x70(%rbp),%rax

位址0x400795:

503

000000000040078c :

50440078c: 55

push

%rbp

50540078d: 48

89 e5 mov %rsp,%rbp

506400790: e8 41 ff ff ff callq 4006d6 507

400795: 90 nop

508400796: 5d pop

%rbp

509400797: c3 retq

位址0x4007a1:

511

0000000000400798 :

512400798: 55

push

%rbp

513400799: 48

89 e5 mov %rsp,%rbp

51440079c: e8 eb ff ff ff callq 40078c 515

4007a1: b8 00

0000

00 mov $0

x0,%eax

5164007a6: 5d pop

%rbp

5174007a7: c3 retq

5184007a8: 0f 1f 84

0000

0000 nopl 0x0(%rax,%rax,1)

5194007af: 00

接下來的兩個棧對於我們的程式分析沒有意義,暫時不討論。

然後我們可以得到棧的層次為

print_trace

()dummy_function

()main

()

跟我們寫出的函式的棧完全相同。

這種除錯方法適用於不能打斷點的一些程式的除錯。

linux下使用者態程式coredump生成方法

總結 1.開啟coredump開關 登陸 linux 伺服器,任意位置鍵入 echo ulimit c 1024 etc profile 1024 限制產生的 core 檔案的大小不能超過 1024kb,可以使用引數unlimited,取消該限制 退出 linux 重新登陸 linux 鍵入 uli...

linux的使用者態和核心態

1 特權級 intel x86架構的cpu一共有0 4四個特權級,0級最高,3級最低,硬體上在執行每條指令時都會對指令所具有的特權級做相應的檢查。硬體已經提供了一套特權級使用的相關機制,軟體自然要好好利用,這屬於作業系統要做的事情,對於unix linux來說,只使用了0級特權級別和3級特權級。也就...

跟蹤使用者的SQL

serial sid addr sql id sql text v session 正在連線的回話 v stransaction 測試伺服器壓力大不大,代表還沒commit的dml操作 v lock 生命週期從dml語句開始,到dml語句結束 v sql 當前使用者的sql語句,sql id has...