2017-03-08 90 views
0

在運行我的QT5項目,我得到警告,如有沒有辦法找到導致警告出現在Qt中的行?

QObject::startTimer: Timers cannot be started from another thread 

等。

儘管許多答案涵蓋了在給定的代碼中導致這些警告或者如何糾正它們,我想知道,其中代碼中的是警告生成的一個回溯。

這是因爲我認爲這是由於我的某些Qt功能的不正確使用導致了內部警告的產生,例如,在上述情況下,使用定時器執行的功能。知道行號將有助於調試,但不幸的是,即使在調試模式下也沒有顯示。

有沒有辦法做到這一點?

This question似乎幾乎相同,但我沒有觀察到類似的問題發佈在那裏的問題 - 我沒有看到任何行號。如果適用,我不知道如何在那裏應用答案。

謝謝。

+0

雖然答案是一樣的。基本上你使用一個自定義的消息處理程序來處理警告,並在那裏放置一個斷點。 – nwp

+1

可能重複[如何重定向qDebug,qWarning,qCritical等輸出?](http://stackoverflow.com/questions/4954140/how-to-redirect-qdebug-qwarning-qcritical-etc-output) – nwp

+0

@nwp謝謝你非常喜歡這個鏈接。但是,我的警告消息無法正常工作。我已經用結果編輯了我的問題。 – GoodDeeds

回答

0

nwp,在評論時指出this answer通過Nawaz,當我把一個破發點上的警告消息行,在這裏偉大的工程:

case QtWarningMsg: 
     fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); //break point here 
     break; 

這給出了一個合適的追蹤在調試器中運行時模式,因爲我需要。

1

最好的方法是設置一個斷點,如其他人提到的那樣。

在Linux上,還可以包括消息模式回溯:

qSetMessagePattern("%{file}:%{line} - %{message}\n%{backtrace depth=10 separator=\"\n\"}"); 

看一看its documentation,尤其是對於限制。 輸出示例:

/home/thomas/src/Qt/5.8-desktop/qtbase/src/corelib/kernel/qobject.cpp:1639 - QObject::startTimer: Timers can only be used with threads started with QThread 
QObject::startTimer 
QTimer::start 
?myapp? 
__libc_start_main 
?myapp? 

因爲我不與-rdynamic聯,所述main()功能沒有在回溯已知的,並且?myapp?打印代替。

相關問題