快速定位步驟
- 編譯加調試符號:
gcc -g -o main main.c -lpthread
- 運行 GDB:
gdb ./main
- 設置參數運行:
(gdb) run 5
- 崩潰後查看堆棧:
(gdb) bt
- 檢查可疑變量:
(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]); // 正確傳遞字符串指針