【问题标题】:Can I somehow filter the error message lines from GCC?我可以以某种方式过滤来自 GCC 的错误消息行吗?
【发布时间】:2017-04-07 13:20:22
【问题描述】:

在使用 C++ 编码时,我经常会收到很长的错误消息,原因是简单的错误,例如函数调用中的参数不匹配或参数歧义。这些错误信息通常跨越数十甚至数百行,很难找到真正的错误在哪里。

是否可以对输出进行一些操作以“懒惰”地找到错误位置?

我正在寻找类似的东西:

make |& xclip_error_loc
... (make output)
(prints and/or adds this to the clipboard: sourcefile.cc:86:2)

这将是一个非常有用的调试工具。我如何做到这一点?

示例编译错误:

Compiling test: "createClusterSizePairFrequencyValidationPlots"...
src/createClusterSizePairFrequencyValidationPlots.cc: In function 'int main(int, char**)':
src/createClusterSizePairFrequencyValidationPlots.cc:167:62: error: no matching function for call to 'TH2I::Fill(const int&, const float&, const char [2])'
 ngthYVsPhi_H  .Fill(cluster.sizeY,       phi, "1");
                                                  ^
In file included from /cvmfs/cms.cern.ch/slc6_amd64_gcc530/cms/cmssw/CMSSW_8_0_18/external/slc6_amd64_gcc530/bin/../../../../../../lcg/root/6.06.00-ikhhed4/include/TH2D.h:25:0,
                 from src/../interface/ClusterPairFunctions.h:7,
                 from src/createClusterSizePairFrequencyValidationPlots.cc:8:
/cvmfs/cms.cern.ch/slc6_amd64_gcc530/cms/cmssw/CMSSW_8_0_18/external/slc6_amd64_gcc530/bin/../../../../../../lcg/root/6.06.00-ikhhed4/include/TH2.h:63:13: note: candidate: virtual Int_t TH2::Fill(Double_t)
    Int_t    Fill(Double_t); //MayNotUse
             ^
/cvmfs/cms.cern.ch/slc6_amd64_gcc530/cms/cmssw/CMSSW_8_0_18/external/slc6_amd64_gcc530/bin/../../../../../../lcg/root/6.06.00-ikhhed4/include/TH2.h:63:13: note:   candidate expects 1 argument, 3 provided
/cvmfs/cms.cern.ch/slc6_amd64_gcc530/cms/cmssw/CMSSW_8_0_18/external/slc6_amd64_gcc530/bin/../../../../../../lcg/root/6.06.00-ikhhed4/include/TH2.h:64:13: note: candidate: virtual Int_t TH2::Fill(const char*, Double_t)
    Int_t    Fill(const char*, Double_t) { return Fi
             ^
/cvmfs/cms.cern.ch/slc6_amd64_gcc530/cms/cmssw/CMSSW_8_0_18/external/slc6_amd64_gcc530/bin/../../../../../../lcg/root/6.06.00-ikhhed4/include/TH2.h:64:13: note:   candidate expects 2 arguments, 3 provided
/cvmfs/cms.cern.ch/slc6_amd64_gcc530/cms/cmssw/CMSSW_8_0_18/external/slc6_amd64_gcc530/bin/../../../../../../lcg/root/6.06.00-ikhhed4/include/TH2.h:75:21: note: candidate: virtual Int_t TH2::Fill(Double_t, Double_t)
    virtual Int_t    Fill(Double_t x, Double_t y);
                     ^
/cvmfs/cms.cern.ch/slc6_amd64_gcc530/cms/cmssw/CMSSW_8_0_18/external/slc6_amd64_gcc530/bin/../../../../../../lcg/root/6.06.00-ikhhed4/include/TH2.h:75:21: note:   candidate expects 2 arguments, 3 provided
/cvmfs/cms.cern.ch/slc6_amd64_gcc530/cms/cmssw/CMSSW_8_0_18/external/slc6_amd64_gcc530/bin/../../../../../../lcg/root/6.06.00-ikhhed4/include/TH2.h:76:21: note: candidate: virtual Int_t TH2::Fill(Double_t, Double_t, Double_t)
    virtual Int_t    Fill(Double_t x, Double_t y, Do
                     ^
/cvmfs/cms.cern.ch/slc6_amd64_gcc530/cms/cmssw/CMSSW_8_0_18/external/slc6_amd64_gcc530/bin/../../../../../../lcg/root/6.06.00-ikhhed4/include/TH2.h:76:21: note:   no known conversion for argument 3 from 'const char [2]' to 'Double_t {aka double}'
/cvmfs/cms.cern.ch/slc6_amd64_gcc530/cms/cmssw/CMSSW_8_0_18/external/slc6_amd64_gcc530/bin/../../../../../../lcg/root/6.06.00-ikhhed4/include/TH2.h:77:21: note: candidate: virtual Int_t TH2::Fill(Double_t, const char*, Double_t)
    virtual Int_t    Fill(Double_t x, const char *na
                     ^
/cvmfs/cms.cern.ch/slc6_amd64_gcc530/cms/cmssw/CMSSW_8_0_18/external/slc6_amd64_gcc530/bin/../../../../../../lcg/root/6.06.00-ikhhed4/include/TH2.h:77:21: note:   no known conversion for argument 2 from 'const float' to 'const char*'
/cvmfs/cms.cern.ch/slc6_amd64_gcc530/cms/cmssw/CMSSW_8_0_18/external/slc6_amd64_gcc530/bin/../../../../../../lcg/root/6.06.00-ikhhed4/include/TH2.h:78:21: note: candidate: virtual Int_t TH2::Fill(const char*, Double_t, Double_t)
    virtual Int_t    Fill(const char *namex, Double_
                     ^
/cvmfs/cms.cern.ch/slc6_amd64_gcc530/cms/cmssw/CMSSW_8_0_18/external/slc6_amd64_gcc530/bin/../../../../../../lcg/root/6.06.00-ikhhed4/include/TH2.h:78:21: note:   no known conversion for argument 3 from 'const char [2]' to 'Double_t {aka double}'
/cvmfs/cms.cern.ch/slc6_amd64_gcc530/cms/cmssw/CMSSW_8_0_18/external/slc6_amd64_gcc530/bin/../../../../../../lcg/root/6.06.00-ikhhed4/include/TH2.h:79:21: note: candidate: virtual Int_t TH2::Fill(const char*, const char*, Double_t)
    virtual Int_t    Fill(const char *namex, const c
                     ^
(lots of similar lines...)

它应该输出:

createClusterSizePairFrequencyValidationPlots.cc:167:62

更新NIoSaT的答案:

复制错误信息:

make 2>&1 | egrep -o ":[0-9]+:[0-9]+: error" | xargs echo -n | xclip -selection clipboard && xclip -selection clipboard -o && echo ""

复制并仅显示第一个错误:

make 2>&1 | egrep -o ":[0-9]+:[0-9]+: error" | head -n 1 | xargs echo -n | xclip -selection clipboard && xclip -selection clipboard -o && echo ""

【问题讨论】:

  • 当您使用 *NIX 系统时,您可以随时将其通过管道传输到 grep 并搜索您想知道的内容
  • 但是你能告诉我我应该尝试什么 grep 来获取错误位置吗?
  • 尝试类似:"make 2>&1 | grep line" 获取行号,如果您想知道错误代码,则使用 grep 获取“错误”
  • @NIoSaT 什么错误代码?我说的是 gcc 编译器(或替代品)。我的问题是我应该如何 grep(如果我什至应该直接这样做)错误位置。
  • 好吧,当 gcc 抛出错误消息时,会有类似“error 1 unknown function myfunc() in line 34”之类的行或类似的行,因此您可以使用 grep 查找“error”以查找输出行其中包含错误号,或者您可以 grep for "line" 以查找其中包含行号的输出行

标签: c++ bash debugging gcc clipboard


【解决方案1】:

为此,您可以使用 grep。

命令是这样的

make 2>&1 | egrep ":[0-9]+:[0-9]+: error:"

这做了两件事

  1. 它将 stderr 移动到 stdout
  2. 它查找:"any number here":"any number": error: 并打印出相应的行

所以你应该只得到你想要的信息的行

更新答案:

复制错误信息:

make 2>&1 | egrep -o ":[0-9]+:[0-9]+: error" | xargs echo -n | xclip -selection clipboard && xclip -selection clipboard -o && echo ""

复制并仅显示第一个错误:

make 2>&1 | egrep -o ":[0-9]+:[0-9]+: error" | head -n 1 | xargs echo -n | xclip -selection clipboard && xclip -selection clipboard -o && echo ""

【讨论】:

  • 你能不能让它只打印错误的文件名和行/列号(没有消息)?
  • 找到解决方案:make 2>&1 | egrep ":[0-9]+:[0-9]+: 错误" |切-d:-f1,2,3 | xargs 回声-n | xclip -selection 剪贴板 && xclip -selection 剪贴板 -o && echo ""
  • 有一个更简单的解决方案,无需“剪切”查看我编辑的帖子,然后您可以添加剪贴板内容
猜你喜欢
  • 2020-05-01
  • 2015-07-05
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多