【发布时间】: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