前言
從事程式設計工作的我們,總有除錯的時刻,不管是通過 ide 除錯開發中的**,還是通過 gdb 排查正在執行的程序。
特別是經常使用 gdb 的童鞋,對它提供的強大功能更加如數家珍,其中就不乏 breakpoint(斷點)。
剛好最近做到 ptrace 相關的實驗,也順便擼了這篇小文來分享下 斷點 當中的道理。
簡單 gdb 示範
// test.cpp
#include
#include
void test1() else {
std::cout << "other signum, skipping..." << std::endl;
ptrace(ptrace_cont, pid, 0, 0);
void break_onece(pid_t pid, long addr) {
// 儲存 addr 舊的指令和暫存器(主要是 rip)
long old_code = ptrace(ptrace_peekdata, pid, addr, null);
user_regs_struct old_regs;
ptrace(ptrace_getregs, pid, null, &old_regs);
long trap_code = old_code;
unsigned char *p = (unsigned char*) &trap_code;
// trap 中斷指令的十六進製制數值
p[0] = 0xcc;
// 用 trap 覆蓋 addr 數值,等 cpu 執行至此就會中斷
if (ptrace(ptrace_pokedata, pid, addr, trap_code)) {
std::cout << "break failed" << std::endl;
return;
ptrace(ptrace_cont, pid, null, null);
dowait(pid);
// 敲入任意字元以繼續,可以在此加入其它除錯邏輯(海闊憑魚躍!!!)
std::cout << "next ? " << std::endl;
std::string instruction;
std::cin >> instruction;
// 恢復 rip, 否則會因缺乏有效 rip 導致 tracee coredump
ptrace(ptrace_setregs, pid, null, &old_regs);
// 恢復 addr 原值
ptrace(ptrace_pokedata, pid, addr, old_code);
ptrace(ptrace_cont, pid, 0, 0);
void quit(pid_t pid) {
ptrace(ptrace_detach, pid, null, null);
std::cout << "quit!" << std::endl;
exit(0);
int main(int argc, char* ar**) {
pid_t pid = std::stoi(ar**[1]);
if (ptrace(ptrace_seize, pid, null, null)) {
perror("ptrace_seize failed");
return -1;
if(ptrace(ptrace_interrupt, pid, 0, 0)) {
perror("interrupt failed");
quit(pid);
dowait(pid);
// 想斷點的位址
long break_addr = 0x400916;
break_onece(pid, break_addr);
quit(pid);
return 1;
編譯 & 執行
g++ trace_test.cpp -std=c++11 -o trace_test
./trace_test 22346 # 本文開頭的程序
總結成本!
其實在文中提到的例子也有非常多可以優化的點:
再比如:應該維護乙份全域性的斷點表,儲存任意多的斷點,也讓每個斷點處可以重複利用;
每個比如都可以展開研究,所以歡迎期待後續。
linux開啟core dump自動生成
使用c c 語言開發程式時,當程式crash的時候產生core dump檔案對於除錯程式是很有幫助的。在redhat linux系統中預設是不生成core dump檔案的,這是因為在 etc profile檔案中有這樣一行 ulimit s c 0 dev null 2 1 如何開啟core dum...
linux下core dump的妙用
在unix系統中,常將 主記憶體 main memory 稱為核心 core 因為在使用半導體作為記憶體材料之前,便是使用核心 core 而核心映像 core image 就是 程序 process 執行當時的記憶體內容。當程序發生段錯誤或收到 訊號 signal 而終止執行時,系統會將核心映像寫入...
Linux 什麼是Core Dump值?
core dump值最初接觸到是在程序控制那個部分,linux 程序的控制 建立 終止 等待 替換 其中程序終止時,子程序的退出狀態status的點陣圖如下 當乙個程序要異常終止時,可以選擇把程序的使用者空間記憶體資料以檔案的形式全部儲存到磁碟上,檔名通常是core,這種行為叫做core dump。...