我是一個新手。我需要打印系統上所有進程的詳細信息。我已將"ps -aux"
的輸出重定向到一個文本文件並將其打開以便顯示。雖然我得到正確顯示所需的細節,但我得到堆棧粉碎錯誤,然後分段錯誤。我可以理解分段錯誤來自fgets
/sscanf
函數之一。我可以知道我哪裏可能會出錯嗎?堆棧粉碎檢測後分段錯誤
if (NULL != (FileDesc = fopen(FileName , "r")))
{
if(! fgets(buf, sizeof(buf), FileDesc))
{
Status = -1;
}
while(NULL != fgets(buf, sizeof(buf), FileDesc))
{
sscanf(buf, "%*s %d %*s %s %*d %*d %*s %s %*s %s %[^\n] ",
&(ProcVar[CurrProcessNum].Pid),
&(ProcVar[CurrProcessNum].Size),
(ProcVar[CurrProcessNum].State),
(ProcVar[CurrProcessNum].CpuTime),
(ProcVar[CurrProcessNum].Cmd));
printf (" PID: %d size: %s State: %s CpuTime: %s Cmd %s",
(ProcVar[CurrProcessNum].Pid),
(ProcVar[CurrProcessNum].Size),
(ProcVar[CurrProcessNum].State),
(ProcVar[CurrProcessNum].CpuTime),
(ProcVar[CurrProcessNum].Cmd));
CurrProcessNum ++;
}
}
示例輸出:
PID: 21342 size: 0.0 State: S CpuTime: 0:00 Cmd [kjournald]
PID: 23384 size: 2.6 State: Sl CpuTime: 39:59 Cmd /opt/Adobe/Reader9/Reader/intellinux/bin/acroread /root/Documents/Comcast_RDK2.0-B13.4_Broadcom_release_notes_20140123.pdf
PID: 23495 size: 0.9 State: Ssl CpuTime: 9:01 Cmd gnome-terminal
PID: 23498 size: 0.0 State: S CpuTime: 0:00 Cmd gnome-pty-helper
PID: 23499 size: 0.0 State: Ss CpuTime: 0:00 Cmd bash
PID: 26733 size: 0.1 State: Ss CpuTime: 0:18 Cmd sshd: [email protected]/3
PID: 26843 size: 0.2 State: Ss CpuTime: 0:01 Cmd -bash
PID: 26943 size: 0.1 State: Ss CpuTime: 0:06 Cmd sshd: [email protected]
PID: 27052 size: 0.0 State: Ss CpuTime: 0:00 Cmd /usr/lib/openssh/sftp-server
PID: 29510 size: 0.0 State: S CpuTime: 0:00 Cmd su root
PID: 29517 size: 0.1 State: S+ CpuTime: 0:04 Cmd bash
PID: 29951 size: 0.1 State: S+ CpuTime: 1:06 Cmd minicom
PID: 30056 size: 0.0 State: Ss+ CpuTime: 0:00 Cmd bash
PID: 30293 size: 0.0 State: Ss CpuTime: 0:00 Cmd bash
PID: 30329 size: 0.0 State: S+ CpuTime: 0:01 Cmd ssh [email protected]
PID: 30597 size: 0.0 State: Ss CpuTime: 0:00 Cmd bash
PID: 30632 size: 0.0 State: S+ CpuTime: 0:00 Cmd ssh [email protected]
PID: 31508 size: 0.0 State: Ss+ CpuTime: 0:00 Cmd bash
PID: 31522 size: 0.1 State: Ss+ CpuTime: 0:00 Cmd bash
*** stack smashing detected ***: bin/TR69_DM terminated
Segmentation fault
最初的'fgets()'沒有任何意義,你是在跳過一個頭文件還是其他東西?此外,顯示更多的聲明。也許'CurrProcessNum'超出'ProcVar'的範圍? – unwind
堆棧粉碎意味着調用者堆棧幀的內容被被調用者以某種方式改變。這是針對緩衝區溢出的安全預防 – mangusta
您可能超過了'ProcVar'的數組大小,您不斷將索引增加到該數組大小。 – noelicus