簡體   English   中英

如何將gdb用於多線程網絡程序

[英]How do I use gdb for multi threaded networking program

我正在使用epoll進行網絡編程。 我遇到了分段錯誤錯誤,但是由於它是在多線程上運行的,因此很難通過使用日志來找到它確切地從哪里得到了錯誤。

我試圖使用gdb,以便可以看到堆棧跟蹤。 如果我在gdb上運行此命令,那么我將從epoll_wait收到此錯誤。 如果我從其他客戶端連接到服務器,則根本無法正常工作。

我該如何解決這個問題,以便可以使用gdb找出它在哪里出現分段錯誤錯誤,謝謝。

epoll_wait error
: Interrupted system call

您需要修復程序才能正確處理EINTR。 EINTR(“中斷的系統調用”)不是致命錯誤; 它只是意味着“請再次重試該系統調用”。 因此,調用epoll_wait()的代碼應該檢測到它,然后以靜默方式重試該調用。 像這樣:

int rv;
do {
    rv = epoll_wait(epfd, events, maxevents, timeout);
} while (rv == -1 && errno == EINTR);

或者,如果您有固定的超時時間,則需要在每次調用時重新計算該超時時間:

int rv;
rv = epoll_wait(epfd, events, maxevents, timeout);
while (rv == -1 && errno == EINTR) {
    ...TODO: recalculate timeout here...
    rv = epoll_wait(epfd, events, maxevents, timeout);
}

如果您對此一無所知,則在調用其他系統調用時可能會遇到相同的錯誤。 特別是read()和write(),還有許多其他調用-檢查手冊頁以查找您使用的調用,並查看它們是否將EINTR列為可能的錯誤。

防止EINTR發生通常不切實際-如果您使用任何使用信號的庫,或者您自己使用信號,則可以獲得EINTR。 上次查看時,Linux線程庫使用了信號。

在您的環境中啟用核心轉儲保存。 運行命令ulimit -c unlimited並重新運行程序。 崩潰時,將生成的核心轉儲加載到gdb中,並查看崩潰的回溯。 在多線程程序的情況下,方便的是一次通過一個命令從所有線程獲取回溯: (gdb) thread apply all bt

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM