將下面的**儲存為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可以看到,程式執行之後,把stack frames完全列印出來了。[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]
我們可以定位各個棧了。
然後用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...