syscall(sys_gettid)/getpid() 獲取當前執行緒/程序號
strace -tt -t -p tid/pid 獲取當前執行緒/程序執行的系統呼叫
得到的結果可能為:
ioctl(237, ***, ***)
或
futex(0x11f4374, ***, ***)
通過系統呼叫中第乙個引數,可以知道鎖的位址或者ioctl的fd等
typedef union
;#endif
} __data;
char __size[__sizeof_pthread_mutex_t];
long int __align;
} pthread_mutex_t;
當是執行緒鎖時,若知道了鎖的位址,即__lock的位址(如0x11f4374),往後+8,即偏移兩個int(乙個int四個位元組),即可得到__owner的位址(如0x11f437c),然後關掉程式的軟狗和硬狗,使用gdb除錯主程序(如test_strace,首先使用ps得到test_strace的程序號,如1230):
./gdb -p 1230
使用
p *(int *)0x11f437c
得到__owner的執行緒/程序號(如1298),使用
cat /proc/1230/task/1298/status
可以看到當前執行緒/程序資訊
繼續使用
strace -tt -t -p tid/pid
看當前執行緒還在等待什麼鎖,一層層往下分析,找到源頭
修改時,很可能是某個退出的地方未釋放鎖導致的,想清楚修改即可。
當是ioctl時,若知道了fd(如237)和並通過ps命令知道主程序test_strace的pid(如1230),則可使用
ls -l /proc/1230/fd/237
得到這個fd所對應的檔案,如/dev/vo,便可定位出是大致**出的問題。 嵌入式開發經驗
任何開發都依賴硬體,在嵌入式領域。cpu的外設很重要,我們一般都是根據外設進行開發。其實cpu的核心 arm powerpc等 反而對於我們而言並不是那樣重要。開發時,乙個好的硬體測試平台很重要。包括偵錯程式和開發環境。同時,晶元資料手冊和參考手冊很重要。但是絕對不是硬生生地像閱讀一本教科書一樣進行...
嵌入式分享討論
關於gpdr,gafr,gpcr和gpsr暫存器的作用 以及他們在相應位置設定不同值時的作用 gpdr gpdr 管腳是輸入端還是輸出端是通過程式設計gpio管腳方向來控制的 暫存器 gpdr0 1 2 3 gpdr暫存器為每個1211gpio引腳,設定值為1的位對應的i o為輸出模式,為0的位對應...
嵌入式gdb gdbserver除錯
在很多情況下,需要對應用程式進行除錯。在 linux 下除錯程式,常用的工具是 gdb。由於嵌入式單板的資源有限,一般不直接在目標機上執行 gdb 進行除錯,而是採取 gdb gdbserver 的方式。gdbserver 在目標機中執行,gdb 則在宿主機上執行。根檔案系 統中已經包含 gdbse...