如何将gcc的错误输出保存到文件

Posted

技术标签:

【中文标题】如何将gcc的错误输出保存到文件【英文标题】:How to save the error output of gcc to file 【发布时间】:2011-08-02 15:22:22 【问题描述】:

当我编译我的代码时,我得到一堆错误,这些错误跨越了屏幕,我可以看到错误从哪里开始。如何将 gcc 的输出保存到文件中?

我尝试过类似的技巧

gcc > 日志.txt

或 grepping 结果,但它没有工作。搜索 google 产生的结果主要是解释如何使用 c++ 打印到文件

【问题讨论】:

“没用”是什么意思? 输出仍然打印在屏幕上 【参考方案1】:

GCC 将错误输出到 标准错误 流而不是 标准输出 流。您需要重定向标准错误,而不是标准输出。在 bash 中:

gcc 2> log.txt

【讨论】:

在 csh 或 tcsh 中:gcc ... >& log.txt(将 stdout 和 stderr 都指向 log.txt,但 gcc 并没有向 stdout 写入太多内容)。【参考方案2】:

我个人发现仅仅将错误输出到文件是没有帮助的。事实上,可以帮助我的最简单的事情是避免包装通常超长的错误行。所以,我决定使用 vim 高亮来更好地查看错误。

没有荧光笔 (View Larger Image)

使用荧光笔 (View Larger Image)

.

幸运的是,有一种非常简单的方法可以在 VIM 中设置新的语法高亮。 按照以下步骤操作,您将更有效率地处理大量模板化的 C++ 代码:

创建一个新的 VIM 自定义语法高亮规则集

你必须定义语法高亮规则。将以下内容放入名为 cerr.vim 的文件中,并将其保存在例如 $HOME/vim_syntax/cerr.vim

"Set line wrapping to off to see more error lines in one page
set nowrap                   
set showmatch
"I use stl and boost alot so it is good to remove the namespaces from the error file :)
silent! %s/st![enter image description here][2]d:://g                                                
silent! %s/boost::fusion:://g                                                  
silent! %s/boost:://g                                                
"Usually I am not interested in the file paths until I can locate the error so I tried to
"hide them
silent! %s/\/[^\.]*\//   /g                                                    
"By default syntax highlighting for each line is limited to 3000 characters    
"However, 3000 characters is not sufficient for lengthy C++ errors, so I change it to 20000
set synmaxcol=20000                                                            
"Now I define the keywords that I would like them to be highlighted
syn keyword cerrInfo instantiated                                             
syn keyword cerrError error Error ERROR                                       
syn keyword cerrWarning warning Warning WARNING
                           
"-------------------------------------                                         
"In this step I would like to distinguish the prefix in each line (which shows the file name) from the rest of the line
syn region cerrLine start=/^/ end=/\:/                                        
syn region cerrSeparator start=/^\.+/ end=/\./ fold oneline

"I want to make templated type information less visible while debugging              
"You have to remember that a type can have nested types. So I define three regions
syn region cerrTemplate1 matchgroup=xBracket1 start=/</ end=/>/ contains=cerrTemplate2 fold oneline
syn region cerrTemplate2 matchgroup=xBracket2 start=/</ end=/>/ contains=cerrTemplate3 fold contained oneline
syn region cerrTemplate3 start=/</ end=/>/ contains=cerrTemplate3 contained oneline fold oneline

"Now I would like to highlight whatever is in parenthesis with a different color so I make
"another region in here. This makes sure that function arguments can have different color            
 syn region cerrPar matchgroup=xBracket start=/(/ end=/)/ contains=cerrTemplate1 oneline fold
"GCC puts the real type information in brackets, let's group them separately
 syn region cerrBracket start=/\[/ end=/\]/ contains=cerrTemplate1,cerrPar oneline

"Again GCC puts the error in these weird characters :) So I define a separate region here
syn region cerrCode start=/‘/ end=/’/ contains=cerrPar,cerrBracket,cerrTemplate1 oneline

"And finally I would like to color the line numbers differently
syn match   cerrNum "[0-9]\+[:|,]"                                            

"--------------------------------------------------------------------------
"Now the fun part is here, change the colors to match your terminal colors. 
"I Use the following colors for my white background terminal.
"In the following we assign a color for each group that we defined earlier

"Comment is a default VIM color group
highlight link cerrInfo Comment     
"We use custom coloring for the rest                                          
highlight default cerrWarning ctermfg=red ctermbg=yellow                      
highlight default cerrError ctermfg=white ctermbg=red                         
highlight default cerrLine ctermfg=grey term=bold                             
highlight default cerrSeparator ctermfg=darkgrey                              
highlight default cerrTemplate1 ctermfg=grey term=bold                        
highlight default cerrTemplate2 ctermfg=grey term=bold                        
highlight default cerrTemplate3 ctermfg=grey                                  
highlight default cerrCode cterm=bold ctermfg=darkgrey                        
highlight default cerrBracket ctermfg=darkgreen                               
highlight default xBracket1 ctermfg=darkgrey term=bold                         
highlight default xBracket2 ctermfg=darkgrey                                   
highlight default cerrPar ctermfg=yellow                                      
highlight default cerrNum ctermfg=red

更改您的 .vimrc 文件

现在,您必须告诉 vim 使用您的新突出显示具有特定扩展名的文件。就我而言,我想将我的错误文件输出到 error.ccerr,将以下内容放入主文件夹中的 .vimrc 中:

au BufRead,BufNewFile *.cerr set filetype=myerror
au Syntax myerror source $HOME/vim_syntax/cerr.vim  

我上面说的是,当使用VIM打开扩展名为.cerr的文件时,它们将被认为是myerror类型。在第二行中,我说 VIM 应该使用我在上一步中为所有 myerror 文件定义的语法高亮规则集。

将您的错误输出发送到 .cerr 文件并使用 VIM 打开它

此步骤最简单,我们将所有错误和警告发送到 error.cerr,如果文件中有任何错误,我们会立即使用 VIM 打开 .cerr 文件。

g++ failing.cc &> error.cerr || vim error.cerr

【讨论】:

我较新的解决方案是使用sublime_text。我已经在here 中写了一个关于如何设置它的快速教程

以上是关于如何将gcc的错误输出保存到文件的主要内容,如果未能解决你的问题,请参考以下文章

如何将终端输出的信息重定向写入文件中呢?

如何将 telnet 输出日志保存到文本文件

如何将谷歌云构建步骤文本输出保存到文件

如何将我的 Python 爬虫输出保存到 JSON 文件?

如何将此输出保存到 python 中的文本文件中?

在 testMovie 命令之后,如何让 JSFL 将跟踪输出保存到文件中?