2016-03-25 53 views
0

通過外部構建系統使用Xcode進行C++開發。如果我使用Xcode 6.2(lldb 320.4.160)一切正常,我可以設置斷點,他們正在被擊中 - 一切都很好。但是,如果我想升級到較新版本的Xcode,例如7.3(lldb 350.0.21.3)我的斷點不再受到攻擊。到目前爲止,我的研究告訴我,由於某種原因,新的lldb無法設置斷點。爲什麼lldb> v320.4.160找不到我的源文件?

一旦我停止程序的執行,並鍵入(lldb) breakpoint list我的輸出是這樣的:

Current breakpoints: 
    1: file = '/full/path/to/src/main.cpp',  line = 842, exact_match = 0, locations = 0 (pending) 
    2: file =  '/full/path/to/src/class.cpp', line = 383, exact_match = 0, locations = 0 (pending) 
    3: file = '/full/path/to/src/Homie.cpp', line = 12, exact_match = 0, locations = 0 (pending) 

(pending)末顯示,英國石油公司可能無法正確設置。如果我現在通過breakpoint set --file main.cpp --line 842設置在LLDB斷點我得到一個斷點,其中(lldb) breakpoint list是給下面的輸出:

4: file = 'main.cpp', line = 12, exact_match = 0, locations = 1, resolved = 1, hit count = 0 
    4.1: where = TEST`::__cxx_global_array_dtor() + 29 at main.cpp:842, address = 0x000000010027130d, resolved, hit count = 0 

這個斷點程序執行過程中被擊中 - 一切美好的事物

如果我嘗試使用Xcode在同一個可執行文件上設置斷點6.2即使使用完整的文件路徑,調試器也可以成功找到源文件。

如何使新的lldb版本正確設置斷點?

謝謝!

回答

0

Xcode始終設置文件&使用它的源代碼完整路徑的概念。當Xcode構建項目時,它可以確保它是「源代碼的完整路徑」,它提供的編譯器(以及編譯器在調試信息中寫入的內容)是相同的。但是對於外部構建系統,它們可能並不相同(例如,構建系統可能指的是通過複雜的相對路徑或通過符號鏈接等的路徑)。調試器不會解析所有源文件路徑的路徑對於大型項目而言,這太昂貴了。所以,如果這些不匹配設置斷點全路徑將無法正常工作。

你可以找出路徑調試器認爲你的main.cpp已經通過設置斷點,然後找到的位置(在上面的例子0x000000010027130d)地址並運行命令:

(lldb) image lookup -va 0x000000010027130d 

一的輸出行將是編譯單元:

CompileUnit: id = {0x00000000}, file = "/tmp/hello-world.c", language = "c99" 

這裏給出的完整路徑與您在Xcode設置斷點時看到的完全相同。如果是的話,我不知道會出現什麼問題,但如果不是的話,你知道原因,這可能會指向你修正它的方向。

+0

是的,這是真正的問題。感謝提示如何找出實際構建到二進制文件中的路徑。調試器尋找'full/path/to /./ src/main.cpp',這顯然不能被調試器解決。我改變了makefile的src路徑,現在它工作正常。 – p0fi

相關問題