首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Linux C 程序 Segmentation Fault 調試:GDB 定位空指針/越界

     編輯:程式設計疑難解答

快速定位步驟

  1. 編譯加調試符號:gcc -g -o main main.c -lpthread
  2. 運行 GDB:gdb ./main
  3. 設置參數運行:(gdb) run 5
  4. 崩潰後查看堆棧:(gdb) bt
  5. 檢查可疑變量:(gdb) print argv[1], print param

常見原因

  • argv[1] 未檢查 argc 直接訪問
  • atoi(argv[1]) 參數非數字返回 0,邏輯錯誤
  • 線程函數參數傳遞錯誤:pthread_create(..., runner, argv[1]) 傳遞的是指針,runner 中 atoi(param) 應為 atoi((char*)param)
  • 全局變量 sum 多線程無鎖競爭(示例中單線程無此問題)

代碼修正片段

if (argc < 2) { fprintf(stderr, "Usage: %s \n", argv[0]); return 1; }
char *endptr;
long n = strtol(argv[1], &endptr, 10);
if (*endptr != '\0' || n < 0) { fprintf(stderr, "Invalid number\n"); return 1; }
pthread_create(&tid, &attr, runner, (void*)argv[1]); // 正確傳遞字符串指針
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved