重定向 stderr 到檔案,方便查詢 bug

2021-05-24 13:22:32 字數 1158 閱讀 9251

為某個外部附件開發應用程式的情況下,開發者無法用 xcode 進行除錯或者用 gdb 檢視 nslog 的輸出,定位和查詢 bug 變得非常困難。好在我們可以通過重定向,將標準的錯誤輸出stderr定向到檔案。

讓我們看下這段**,它的作用就是在程式內部的資料夾 documents 中新建乙個名為 decrypt.log 的檔案,並且將所有的 stderr 輸入到 decrypt.log

檔案中。如此一來所有關於 stderr 的輸出都將被重定向到 decrypt.log,在 gdb 中你將無法再看到這些資訊。

選擇 xcode->windows->organizer,找到你的裝置,在 summary 一欄中找到你的程式,將其展開,點選右邊的箭頭,這樣程式內部的所有資料夾都將匯出到你所指定的位置。organizer 左邊一欄的 projects&sources 展開便能找到這個檔案。

關於 printf, fprintf 和 nslog:

可能你大量使用了外部的 c 庫,它們以 printf 或者 fprintf 來輸出資訊 ,那麼它們的區別又是什麼?標準的 printf 是將除錯資訊輸入到標準輸出流 stdout,也就是說你用上面提供的函式是無法將此重定向的,你必須

reopen([logpath cstringusingencoding:nsasciistringencoding], "w+", stdout);

而 fprintf 則可以指定你所要輸出的除錯資訊的位置,包括 stdout、stderr 甚至是一般的檔案。這裡我們輸出到 stderr

fprintf(stderr, "hello/n");

nslog 本質上其實也是將除錯資訊輸出到 stderr,但與 fprintf 不同它還有些不一樣的特性。我們在使用 xcode 進行除錯的時候無論採用哪種方式輸出錯誤資訊總是第一時間重新整理在螢幕上,但定向到檔案卻有所不同。nslog 總是能第一時間寫到檔案,而 printf 或 fprintf 似乎將是資訊儲存在快取中,等待某種契機或者訊號才會將資訊寫到檔案中。如此一來辛苦準備的除錯資訊卻可能因為程式的崩潰而什麼也無法看到。所以我們可以通過 fflush 來強制它進行重新整理。如下,我們強制重新整理 stderr

fflush(stderr)

最後給大家兩個除錯用的巨集

__file__  分別是所在的檔案 (字串)

__line__  和行號(數字)

Cout重定向到檔案

cout預設是與監視器 螢幕 相連,cout出來的內容會輸出到螢幕上,通常是會在命令列視窗之中。但有時,我們希望將cout出來的具體日誌 錯誤資訊寫到某個檔案之中,而螢幕上僅僅顯示出當前進行的任務,以及程式執行狀態等資訊。我們可以使用下面重定向的方式來實現 cpp view plain copy i...

重定向stdout到檔案

把stdout重定向到檔案 兩種方法 第一種方法沒有恢復 通過freopen把stdout重新開啟到檔案 include file stream void main void fprintf stdout,this is not print out n 這裡沒有輸出 system ls 沒有會造成問...

C stderr stdout 重定向到檔案

通常,stderr和stdout被用來輸出內容顯示到螢幕,但是,有時候我們需要把這些資訊寫到指定的檔案,方便隨時查閱。最簡單的實現方式就是,把 stderr stdout 的輸出 重定向到檔案。這裡以stderr 說明。include include int main void windwos下讀取...