std thread 中的異常會丟失呼叫棧

2021-09-27 10:45:09 字數 952 閱讀 1962

(金慶的專欄 2019.9)

主函式中的異常生成core檔案能看到呼叫棧,

但是 std::thread 子執行緒中的異常生成 core 檔案的呼叫棧如下:

program received signal sigabrt, aborted.

[switching to thread 0x7f18f00ab700 (lwp 32340)]

0x00007f19007335f7 in raise () from /lib64/libc.so.6

(gdb) bt

#0 0x00007f19007335f7 in raise () from /lib64/libc.so.6

#1 0x00007f1900734ce8 in abort () from /lib64/libc.so.6

#2 0x00007f19010379d5 in __gnu_cxx::__verbose_terminate_handler() () from /lib64/libstdc++.so.6

#3 0x00007f1901035946 in ?? () from /lib64/libstdc++.so.6

#4 0x00007f1901035973 in std::terminate() () from /lib64/libstdc++.so.6

#5 0x00007f190108c2b5 in ?? () from /lib64/libstdc++.so.6

#6 0x00007f19012e7dc5 in start_thread () from /lib64/libpthread.so.0

#7 0x00007f19007f41cd in clone () from /lib64/libc.so.6

(gdb)

呼叫棧丟失使除錯無法找到問題點。

據說 gcc 8 修正了該問題。

參考:

std thread中獲取當前執行緒的系統id

std thread不提供獲取當前執行緒的系統id的方法,僅可以獲取當前的執行緒id,但是我們可以通過建立索引表的方式來實現 1 std mutex m 2 std mapthreads 3void48 void wrap void f 9 而後用其建立執行緒 1 std thread t1 wra...

異常 C 中的異常

本文參照於狄泰軟體學院 c 深度剖析課程 之前我們分析了c語言中異常處理的方式,基本沒有好的解決方案。那麼c 中會如何優化c語言對異常的處理的缺陷呢?c 內建了異常處理的語法元素try catch try語句處理正常 邏輯 catch語句處理異常情況 try語句中的異常由對應的catch語句處理 t...

java中異常處理中的異常匹配

先貼上 class annoyance extends exception class sneeze extends annoyance public class test catch sneeze s catch annoyance a catch派生物件 trycatch annoyance a...