台灣大哥大寄了實體信件通知電子發票中獎, 202312 帳單中獎, 會需要 202312 帳單上的資料, 到 7-11 印出中獎發票。
麻煩的是我沒 202312 帳單, 都是從台灣大哥大 app 繳款, 所以要印出中獎發票有點麻煩。
從 mail 的 qr code 連到 https://ow.tstarcs.taiwanmobile.com/TWM/electronicInvoice.php, 裡頭有發票資訊, 找出中獎的那期, 以我的例子是 202401 那期。記住載具號碼, 那個可以在 7-11 ibon 印出電子發票; 另外還需要載具類別, 台灣大哥大固定是 EJ0118, 這些資訊當期帳單都有, 所以沒有帳單會比較麻煩,
拿到 7-11 兌換會有 2 元印花稅。
人體汽肛 - 風馳電掣, 人車一體
版權所有, 歡迎盜考
2024年4月26日 星期五
2024年4月21日 星期日
借閱電子版漫畫 - hyread/台灣雲端書庫
hyread app 可以借閱圖書館書籍, 來試試看。加入某個圖書館, 需要有帳號, 之前有申請借書證就應該會有。
最近開始借閱圖書館電子漫畫, 覺得好像不用自己買電子版, 閱讀體驗和自己買的電子版完全一樣, 不知道圖書館的電子版是不是永久存在, 還是也會下架。反正購買的電子書也不能擁有, 在圖書館借閱也不會擁有電子書, 實在沒動機購買電子版本。
我會借閱漫畫和雜誌的部份, 漫畫和雜誌還勉強可以用 LCD 螢幕看; 書籍還是用 e-ink 螢幕看比較適合, 我沒辦法在 LCD 螢幕看大篇文字。
台灣雲端書庫 app 也可以借閱電子書, 一樣是用圖書館帳號登入。魔法使的 5, 6 hyread 不知道為什麼沒有, 台灣雲端書庫則是可以借閱。
ref:
電子書借閱新政上路 每人無上限且回饋補助作者
最近開始借閱圖書館電子漫畫, 覺得好像不用自己買電子版, 閱讀體驗和自己買的電子版完全一樣, 不知道圖書館的電子版是不是永久存在, 還是也會下架。反正購買的電子書也不能擁有, 在圖書館借閱也不會擁有電子書, 實在沒動機購買電子版本。
我會借閱漫畫和雜誌的部份, 漫畫和雜誌還勉強可以用 LCD 螢幕看; 書籍還是用 e-ink 螢幕看比較適合, 我沒辦法在 LCD 螢幕看大篇文字。
台灣雲端書庫 app 也可以借閱電子書, 一樣是用圖書館帳號登入。魔法使的 5, 6 hyread 不知道為什麼沒有, 台灣雲端書庫則是可以借閱。
ref:
電子書借閱新政上路 每人無上限且回饋補助作者
標籤:
78
2024年4月12日 星期五
signal handle backtrace (0) - signal handle 如何 return
我不是無所不知, 只是剛好知道而已。 |
應該可以吧, 你這麼認為, 覺得在 signal handle 執行 backtrace 和在一般 function 執行 backtrace 不應該有什麼不同才是。
在這之前可以先想想看, 你寫的程式要怎麼辦到在 signal 來時, 切斷正在執行的部份, 然後轉到 signal handle 執行, 最後還可以接回原本的地方執行。
先來看看當 signal handle 發動的時候, 整個處理流程是怎麼樣? 設計了一個小程式來做這樣的實驗, 按照 t1.c 的程式, 有 2 個 thread, 一個停在 L255 while, 一個停在 L384 while, 這時候 kill pid 會得到怎麼樣的 backtrace 呢?
list 1 列出 2 個 thread 的 pid, tid。一個是 main thread, 一個是用 pthread_create() 建立的 thread。gettid 用法在 t1.c L16 ~ L20。
list 2. 使用 glibc backtrace() 得到的結果。
如果是由我自己藉由 rpb 追朔 stack 就不是這樣, 少了一部分的資訊。list3 少了 list 2 紅色部份, fun_223, fun_123。
對於這樣的結果覺得很不爽, 為什麼從 stack frame 無法追朔完整, 而 backtrace() 可以。原因很複雜, 晚點再說。
先來看看為什麼有一個沒出現的 function - __restore_rt。
這個 __restore_rt function 的內容很簡單, 如 list 5, 一個 system call, 查了一下, 參考 list 6 - rt_sigreturn, man rt_sigreturn 可以知道其內容, 英文不好懂是吧, 讓 chatgpt 翻譯一下, 就容易理解了。
當 kernel 要執行 signal handle 要怎麼做呢? 現在的程式可是執行在 while 的地方, 有什麼辦法可以改到 t1.c L136 void sig_handler(int signo) 執行呢? 不好想吧, 當 t1 process 睡覺時要再次執行之前, kernel 做了手腳, 改動 rip, 讓 t1 process 從 sig_handler 執行, 當然也要在 stack frame 做一些操作, 否則 sig_handler 執行時, 會用到原本的 rsp, 也許會有問題, 一般會建立一個新的 stack frame 讓 sig_handler 在這邊操作 stack, 就不會影響到其他 function 的 stack frame。
當要從 signal handle 回到原本執行的地方 (此例子是回到 while) 要怎麼做呢? 有 2 種作法, signal handle return 時, stack return address 塞 while 的位址, 這樣就回去了。不過 linux kernel 不是這麼做, 用了一個奇特的作法。
一樣是安插了一個 return address, 在 signal handle return 之後會跑去執行 __restore_rt, 然後執行 rt_sigreturn system call 回到 kernel, 這時候再把原本 t1 要執行的 while 回復, 等到下次執行 t1 時, 就從 while 開始執行。
至於為什麼自己寫的 backtrace 查不到 fun_123, 簡單來說就是 __restore_rt 的 return address 不是 fun_123, 而是 fun_123 的上一層 fun_12, 自然從 stack frame 找不到 fun_123 這個資訊, 那為什麼 glibc backtrace 找得到呢? 因為它用了別的方法, 下一篇再來介紹這個魔法。
ref:
- Linux - signal处理的一些补充
- Linux 核心設計: Signal
- Linux操作系统学习笔记(十六)进程间通信之信号
- man sigreturn
2024年4月7日 星期日
ff7-reamek mod on steam deck
很久之前就一直很想用 mod, 但都找不到方法, 直到發現以下影片後終於知道要怎麼用 mod。
因為我玩 steam 遊戲幾乎都是用 steam deck, 怕這些 mod 在 steam deck/linux 上很難搞, 還好運氣不錯, 成功在 steam deck/linux 上執行這些 mod, 以下安裝路徑是以 steam deck 為主。影片介紹的是以 windows 路徑為主。
ff7-reamek mod 網址: https://www.nexusmods.com/finalfantasy7remake, 需要註冊才能下載 mod。
mod 檔案放到 /home/deck/.local/share/Steam/steamapps/common/FINAL FANTASY VII REMAKE/End/Content/Paks/
我依照影片建議建立了 ~mods, /home/deck/.local/share/Steam/steamapps/common/FINAL FANTASY VII REMAKE/End/Content/Paks/~mods, 也和影片一樣先用潔西測試, 成功了。建議先照影片流程把 安裝測試好, 再來玩其他模組。
/home/deck/.local/share/Steam/steamapps/common/FINAL FANTASY VII REMAKE/End/Content/Paks/~mods
我把 ~mods 改成 0-mods 有些 mod 會失效, 所以還是都用 ~mods, 看起來好像是個不成文規定的命名, 有些 mod 還會相依其他 mod, 比較麻煩。
另外也把存檔位置找出來, 30 個存檔不夠用, 只好自己備份。
save files: /home/deck/.local/share/Steam/steamapps/compatdata/1462040/pfx/drive_c/users/steamuser/Documents/My Games/FINAL FANTASY VII REMAKE/Steam/76561198098462161
設定成人 mod:
[模組MOD] 模組網站nexusmods,開啟成人內容,以及分享其他不重要的小事
[模組MOD] 艾莉絲裸裝 - FFVII-重製版
Tifa 4K Hi-Poly Nude Mod (tifa 裸體)
測試了好多 mod, 最後還是選國王的新衣。
綠意公園 tifa, aerith 那段, 短短2分鐘動畫效果超棒! 同時可以看到 tifa, aerith, 可惜不好放上來。
使用這些遊戲 mod 還蠻有門檻的, 不是無腦就可以搞定, 要花時間查資料。
在 steam deck 上操作不像 windows 方便, 除非你接鍵盤滑鼠外接螢幕又進入桌面模式, 我是用 ssh 登入, 直接打指令操作, 另外可以使用 symbolic link 就不用一直搬移檔案, 如 list 5。
另外由於路徑很長, 用了 symbolic link 縮短路徑, 如 list 6。
以下的表情很有趣, cloud 看到 aerith 打扮的很漂亮的表情 (正常男人看到女人裸體應該都是這表情); aerith 看到 cloud 打扮的很漂亮的表情。
Bee costume mod 蜜蜂裝也不錯, 玩起來不尷尬。
ref:
【情報】FF7R PC版MOD始動 (2022/06/18 更新STEAM版設定與控制台支援 )
因為我玩 steam 遊戲幾乎都是用 steam deck, 怕這些 mod 在 steam deck/linux 上很難搞, 還好運氣不錯, 成功在 steam deck/linux 上執行這些 mod, 以下安裝路徑是以 steam deck 為主。影片介紹的是以 windows 路徑為主。
ff7-reamek mod 網址: https://www.nexusmods.com/finalfantasy7remake, 需要註冊才能下載 mod。
FFVIIHook 1.7-74-1-7-1708987498 2022/01/11 下午 06:13 1,480 Engine.ini 2024/02/27 上午 06:23 25,088 xinput1_3.dll放到 /home/deck/.local/share/Steam/steamapps/common/FINAL FANTASY VII REMAKE/End/Binaries/Win64
(deck@steamdeck Win64)$ ls "/home/deck/.local/share/Steam/steamapps/common/FINAL FANTASY VII REMAKE/End/Binaries/Win64" Engine.ini ff7remake_.exe vkd3d-proton.cache xinput1_3.dll
mod 檔案放到 /home/deck/.local/share/Steam/steamapps/common/FINAL FANTASY VII REMAKE/End/Content/Paks/
我依照影片建議建立了 ~mods, /home/deck/.local/share/Steam/steamapps/common/FINAL FANTASY VII REMAKE/End/Content/Paks/~mods, 也和影片一樣先用潔西測試, 成功了。建議先照影片流程把 安裝測試好, 再來玩其他模組。
/home/deck/.local/share/Steam/steamapps/common/FINAL FANTASY VII REMAKE/End/Content/Paks/~mods
我把 ~mods 改成 0-mods 有些 mod 會失效, 所以還是都用 ~mods, 看起來好像是個不成文規定的命名, 有些 mod 還會相依其他 mod, 比較麻煩。
另外也把存檔位置找出來, 30 個存檔不夠用, 只好自己備份。
save files: /home/deck/.local/share/Steam/steamapps/compatdata/1462040/pfx/drive_c/users/steamuser/Documents/My Games/FINAL FANTASY VII REMAKE/Steam/76561198098462161
設定成人 mod:
基本上從這邊進去 site preferences (右上角的按鈕) Content blocking Adult content 勾選 Show adult content
[模組MOD] 模組網站nexusmods,開啟成人內容,以及分享其他不重要的小事
[模組MOD] 艾莉絲裸裝 - FFVII-重製版
Tifa 4K Hi-Poly Nude Mod (tifa 裸體)
測試了好多 mod, 最後還是選國王的新衣。
綠意公園 tifa, aerith 那段, 短短2分鐘動畫效果超棒! 同時可以看到 tifa, aerith, 可惜不好放上來。
使用這些遊戲 mod 還蠻有門檻的, 不是無腦就可以搞定, 要花時間查資料。
在 steam deck 上操作不像 windows 方便, 除非你接鍵盤滑鼠外接螢幕又進入桌面模式, 我是用 ssh 登入, 直接打指令操作, 另外可以使用 symbolic link 就不用一直搬移檔案, 如 list 5。
另外由於路徑很長, 用了 symbolic link 縮短路徑, 如 list 6。
fig 8. ff7-remake mod on steam deck |
以下的表情很有趣, cloud 看到 aerith 打扮的很漂亮的表情 (正常男人看到女人裸體應該都是這表情); aerith 看到 cloud 打扮的很漂亮的表情。
fig 5 aerith 在按摩館的打扮 | fig 6 看到aerith 在按摩館的打扮後的神情 |
fig 7 aerith 看到 cloud 女裝的神情 | fig 8 cloud 女裝 |
Bee costume mod 蜜蜂裝也不錯, 玩起來不尷尬。
ref:
【情報】FF7R PC版MOD始動 (2022/06/18 更新STEAM版設定與控制台支援 )
2024年4月3日 星期三
Sweet Baby Inc detected, 遊戲政確推手 Sweet Baby
Sweet Baby 是令遊戲玩家噁心的組織, 簡稱她們 sb 好了, 政治政確這種事情想不到也傳到遊戲產業。還好有《劍星》出來拯救玩家, 希望《劍星》能靠銷售量讓那些搞不清楚的遊戲公司清醒, 不要亂加入政治政確的東西。本來對政治政確的元素沒那麼反感, 現在只要看到遊戲有這些元素, 就不想買了, 不管你的原本設計是這樣還是政治政確的關係 (因為我分不出來是哪種), 玩個遊戲也要這麼累, 真煩。
打著理想的口號做噁心的事情, 還偷偷摸摸隱藏在台面下。
另外也會參考 ref 2 的不推薦遊戲 (有被 SB 染指的遊戲), 列在上面的都不會買, 管你是幾A大作。至少有神鬼寓言4, 最后的生还者2 , 漫威蜘蛛侠2 , 战神5, 消逝的光芒2。
另外懷疑 ff7-remake 以下的部份可能是政治政確。
fig 5. 應該是比較正常的女生角色, 另外2個有點醜化和黑色膚種, 另外是 cloud 女裝, 希望是我自己想太多。不過 cloud 女裝這段其實蠻有趣。
fig 5. 比較正常的女生角色 |
ref:
2024年3月31日 星期日
tpass 購買與設定
「TPASS 行政院通勤月票一卡通」為「行政院促進公共運輸使用方案」, 購買和設定不是很容易, 紀錄一下。
購買方式不是很方便的從那個地點直接購買, 需要預購, 用 ibon 或是上網購買, 也就是要等卡片寄來, 很麻煩, 所以我直接去捷運站購買, 在捷運站服務處可以直接購得, 所以不在捷運站區域的人, 就只能線上購買。
登入會員設定, 需要使用 app 設定這張卡, 還要實名認證, 需要卡片的照片, 身份證的照片, 我之前因為實名問題不太想用, 最後還是因為價錢屈服了。
有各種方案的儲值, 我是用 399 臺鐵方案, 一樣在捷運站服務處處理, 還需要指定一個月的區間, 例如 20240301 ~ 20240331。
為了怕那個步驟搞不定, 我在捷運站完成這3個步驟, 才離開, 然後到臺鐵測試, tpass 可以正常使用。
若是用 app 儲值, 還需要到 ibon 登記卡片的一個月使用區間。目前似乎也可以用手機 NFC 過卡了。
這個補助對固定搭乘大眾交通工具的人幫助很大, 省下不少錢, 以我自己一個月來說大概省 600-399 = 201, 但我算是短程, 長程會省更多。應該也會多鼓勵人們搭乘大眾運輸工具。沒用到的人可能會不太爽, 畢竟是用納稅人的錢補助。 20240420 通過認證, 花了快一個月。
購買方式不是很方便的從那個地點直接購買, 需要預購, 用 ibon 或是上網購買, 也就是要等卡片寄來, 很麻煩, 所以我直接去捷運站購買, 在捷運站服務處可以直接購得, 所以不在捷運站區域的人, 就只能線上購買。
登入會員設定, 需要使用 app 設定這張卡, 還要實名認證, 需要卡片的照片, 身份證的照片, 我之前因為實名問題不太想用, 最後還是因為價錢屈服了。
有各種方案的儲值, 我是用 399 臺鐵方案, 一樣在捷運站服務處處理, 還需要指定一個月的區間, 例如 20240301 ~ 20240331。
為了怕那個步驟搞不定, 我在捷運站完成這3個步驟, 才離開, 然後到臺鐵測試, tpass 可以正常使用。
若是用 app 儲值, 還需要到 ibon 登記卡片的一個月使用區間。目前似乎也可以用手機 NFC 過卡了。
這個補助對固定搭乘大眾交通工具的人幫助很大, 省下不少錢, 以我自己一個月來說大概省 600-399 = 201, 但我算是短程, 長程會省更多。應該也會多鼓勵人們搭乘大眾運輸工具。沒用到的人可能會不太爽, 畢竟是用納稅人的錢補助。 20240420 通過認證, 花了快一個月。
標籤:
78
2024年3月21日 星期四
實做 c backtrace
c 的 backtrace 是在 call function 時, 如何得知誰 call 了這個 function。
c 的 backtrace 如何做到, 問 chatgpt 馬上就給出 list 1. 的範例程式, 真的好用, 以 list 2 來說:
但如果再問 chatgpt 要怎麼實做 backtrace(), backtrace_symbols(), 它就鬼打牆了。
所以如果不借助 backtrace(), backtrace_symbols() 要怎麼辦到呢?
這和平台有關, 本篇是在 x86_64 環境的實做。
先來理解 c 語言呼叫 function 時做的動作, 參考 list 3 的反組譯。
L902 main call f1, L884 ~ L886 是進入 f1 時做的事情。
指令 call 會發生的 sp 操作: rsp - 8, 再把 ret address 放入 rsp, 我用 gdb 把從 main 到 f2 時的 stack 內容記錄在 table 1。
用了 -no-pie 是希望不要編譯成 relocation 的執行檔, 用 objdump 在對照位址時比較方便。其他編譯選項沒太大影響。
原理是這樣, 先抓到目前 rbp 的值, 假如目前在 f2, 抓到 f2_rpb 就可以知道 f1 function 的 rpb f1_rpb, 知道了 f1_rpb 就可以知道 main function 的 rpb, 那麼知道每個 function 的 rbp 要幹麻呢? 為了取得 return address, 怎麼取得, 每層 function 的 rbp + 8 的位址就可以得到 (對照 table 1. L1, L3)。
寫成 c code 就是: 上一層 function 的 return address = *(uintptr_t*)(rpb + 8)
那麼又怎麼從目前 function 的 rpb 值得到上一層的 rpb 值呢? 從 rpb 值的位址取得 (參考 table 1. L2, L4), 寫成 c code 就是: 上一層 function 的 rpb = *(uintptr_t*)(rpb)
這樣一層一層追, 就可以追到 __libc_start_main, 那 _start 追得到嗎? 抱歉, 目前我還不知道怎麼從 __libc_start_main 追到 _start (backtrace(), backtrace_symbols() 可以追到 _start)。另外還有一個問題, 從這層的 rpb 一直追到上一層的 rpb, 要怎麼判定追到 __libc_start_main 這層了, 這邊是觀察出來的, 上一層的 rpb 應該會比目前這層的 rpb 大, 我就這樣判定, 有可能會出錯嗎? 當然有可能, 但我想不到別的辦法了。list 6 L105, L106 有類似的檢查條件。
list 2. L81 ~ L139 就是在做這樣的事情。另外還需要知道目前在那個 function, 所以用了 L77 得到目前的位址。這些抓暫存器、抓目前位址都是透過 chatgpt 問到, 相當方便。
再來有了位址要怎麼找出對應的 function, 這邊我偷懶了, 直接使用 addr2line 這個指令幫忙。光是 addr2line 怎麼辦到的, 可能又是一個主題了。
list 2 L142, L146 就是在取得 rbp 和 return address, __builtin_frame_address(), __builtin_return_address() 是 gcc 內建 function, 比較有可攜性。我不滿足這樣的作法, 想「知道」怎麼辦到的, 才有了本篇文章。
在 glibc 2.39 sysdeps/i386/backtrace.c __backtrace (void **array, int size) 可以看到類似的作法。
ref:
誰在呼叫我?不同的backtrace實作說明好文章
c 的 backtrace 如何做到, 問 chatgpt 馬上就給出 list 1. 的範例程式, 真的好用, 以 list 2 來說:
_start -> __libc_start_main -> main -> f1 -> f2 -> f3 -> print_backtrace會得到
xx [0x400b7b] xx [0x400d60] xx [0x401087] xx [0x4010a4] xx [0x4010c0] xx [0x401689] xx [0x400a5a]使用 addr2line 可以查到對應的 function
addr2line -f -e t2 0x400b7b print_backtrace /home/descent/git/progs/backtrace/t2.c:15 addr2line -f -e t2 0x400a5a _start ??:?會得到: print_backtrace -> f3 -> f2 -> f1 -> main -> __libc_start_main -> _start
但如果再問 chatgpt 要怎麼實做 backtrace(), backtrace_symbols(), 它就鬼打牆了。
所以如果不借助 backtrace(), backtrace_symbols() 要怎麼辦到呢?
這和平台有關, 本篇是在 x86_64 環境的實做。
先來理解 c 語言呼叫 function 時做的動作, 參考 list 3 的反組譯。
L902 main call f1, L884 ~ L886 是進入 f1 時做的事情。
902 4010bb: e8 ca ff ff ff callq 40108a <f1> main call f1 時, f1 會做 884 000000000040108a <f1>: 885 40108a: 55 push %rbp 886 40108b: 48 89 e5 mov %rsp,%rbp 890 40109f: e8 c9 ff ff ff callq 40106d <f2> f1 call f2 時, f2 會做 873 000000000040106d <f2>: 874 40106d: 55 push %rbp 875 40106e: 48 89 e5 mov %rsp,%rbp
push %rbp mov %rsp,%rbp都是在 function 的最開始時會做的事情 (table 1. L2, L4)。table 1. main call f1, f1 call f2 把 rsp 的內容整理起來。
0 | sp | |||
1 | call f1 | 0x7fffffffe058 | ret addr 0x4010c0 | |
2 | push %rbp (main_rbp) ; f1_rbp=rsp = 0x7fffffffe050 | 0x7fffffffe050 | main_rbp (0x7fffffffe070) | |
3 | call f2 | 0x7fffffffe048 | ret addr 0x4010a4 | |
4 | push %rbp (f1_rbp) ; f2_rbp=rsp = 0x7fffffffe040 | 0x7fffffffe040 | f1_rbp (0x7fffffffe050) |
指令 call 會發生的 sp 操作: rsp - 8, 再把 ret address 放入 rsp, 我用 gdb 把從 main 到 f2 時的 stack 內容記錄在 table 1。
用了 -no-pie 是希望不要編譯成 relocation 的執行檔, 用 objdump 在對照位址時比較方便。其他編譯選項沒太大影響。
原理是這樣, 先抓到目前 rbp 的值, 假如目前在 f2, 抓到 f2_rpb 就可以知道 f1 function 的 rpb f1_rpb, 知道了 f1_rpb 就可以知道 main function 的 rpb, 那麼知道每個 function 的 rbp 要幹麻呢? 為了取得 return address, 怎麼取得, 每層 function 的 rbp + 8 的位址就可以得到 (對照 table 1. L1, L3)。
寫成 c code 就是: 上一層 function 的 return address = *(uintptr_t*)(rpb + 8)
那麼又怎麼從目前 function 的 rpb 值得到上一層的 rpb 值呢? 從 rpb 值的位址取得 (參考 table 1. L2, L4), 寫成 c code 就是: 上一層 function 的 rpb = *(uintptr_t*)(rpb)
這樣一層一層追, 就可以追到 __libc_start_main, 那 _start 追得到嗎? 抱歉, 目前我還不知道怎麼從 __libc_start_main 追到 _start (backtrace(), backtrace_symbols() 可以追到 _start)。另外還有一個問題, 從這層的 rpb 一直追到上一層的 rpb, 要怎麼判定追到 __libc_start_main 這層了, 這邊是觀察出來的, 上一層的 rpb 應該會比目前這層的 rpb 大, 我就這樣判定, 有可能會出錯嗎? 當然有可能, 但我想不到別的辦法了。list 6 L105, L106 有類似的檢查條件。
list 2. L81 ~ L139 就是在做這樣的事情。另外還需要知道目前在那個 function, 所以用了 L77 得到目前的位址。這些抓暫存器、抓目前位址都是透過 chatgpt 問到, 相當方便。
再來有了位址要怎麼找出對應的 function, 這邊我偷懶了, 直接使用 addr2line 這個指令幫忙。光是 addr2line 怎麼辦到的, 可能又是一個主題了。
list 2 L142, L146 就是在取得 rbp 和 return address, __builtin_frame_address(), __builtin_return_address() 是 gcc 內建 function, 比較有可攜性。我不滿足這樣的作法, 想「知道」怎麼辦到的, 才有了本篇文章。
在 glibc 2.39 sysdeps/i386/backtrace.c __backtrace (void **array, int size) 可以看到類似的作法。
ref:
誰在呼叫我?不同的backtrace實作說明好文章
訂閱:
文章 (Atom)