簡體   English   中英

GDB可以調試C ++ lambdas嗎?

[英]Can GDB debug C++ lambdas?

我主動使用C ++ 11功能。 我在Visual Studio 2013中創建的程序依賴於lambdas來運行多個線程(lambda表示任務,而線程接收它必須運行的lambda實例)。 Lambda在靜態庫中定義,並鏈接在可執行文件中,該文件從此可執行文件創建的線程調用它。 當我嘗試使用GDB調試此應用程序的Linux版本時,看起來GDB無法進入包含lambda的方法。 它不能在這個函數中設置斷點,當我嘗試進入時,它甚至會進入lambda從其體調用的方法,但是從這些方法return之后它不會轉到lambda體,它會轉到下一個方法lambda調用等。有沒有辦法用GDB調試lambdas體?

我以前在堆棧跟蹤中看過它們,所以它至少知道它們。 我從未試過在一個中設置一個普通的斷點。 這是一種破解,但你可以通過使用asm volatile("int $3");在一個(或任何地方)設置一個斷點asm volatile("int $3"); 在x86(-64)上。

這是一個示例程序:

int main(){
    auto f = [](){
        asm volatile("int $3");
    };
    f();
    return 0;
}

這是它擊中斷點時的回溯:

#0  0x0000000000400577 in main::{lambda()#1}::operator()() const ()
#1  0x000000000040058d in main ()

根據我的經驗,gdb無法進入lambda - 它只是跳過它們。 不僅如此,單步執行lambda定義似乎會混淆gdb,並且它會繼續到當前函數的末尾。 但是,您可以在lambda中明確放置斷點,如果點擊該點,則會停止。 這顯然遠非理想。

進入Lamba的.run()轉到下一步/步驟(跳轉初始化)直到以下調用:

std::forward<>(args)(...)

走進這一步。 它會引導你到lambda身體代碼。

暫無
暫無

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

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