好吧,這聽起來像一個愚蠢的問題,但我卡住了:我在lldb調試會話期間讀取變量的值時遇到了問題(事情與gdb一起工作正常)。使用lldb打印變量的內容
我發現了其他人遇到過的錯誤消息比我自己的帖子,但不同的是,我甚至不知道如何打印出最簡單形式的變量的值。
爲了更好地表達我的問題,我將在這裏考慮一個非常簡單的例子。我們打開一個 「main.c」 包含以下代碼:
#include <stdlib.h>
#include <stdio.h>
int main(void) {
int a = 1;
int b = 2;
int c = 0;
c = a + b;
c = c*b;
printf("c = %d\n", c);
return 0;
}
我使用編譯:
[email protected] ~ $ gcc -g main.c
生成名爲 「a.out的」 一個二進制文件
我然後ivoque lldb:
[email protected] ~ $ lldb-3.4 ./a.out
我想停在第9行和讀取c的值。因此,我開始通過添加一個斷點:
(lldb) breakpoint set -f main.c -l 9
然後我運行代碼:
(lldb) run
截至目前爲止,每一件事情都按預期。現在出現棘手的部分:我想讀取變量c的值。因此,我寫:
(lldb) print c
而且LLDB返回我:
error: use of undeclared identifier 'c'
error: 1 errors parsing expression
當然:
(lldb) expression c
回報完全相同的錯誤消息。
有什麼我錯過了嗎?任何幫助將非常感激。
我的設置:
- LLDB: 「LLDB版本3.4(修訂版)」(套餐五: 「3.4〜svn183914-1ubuntu1」)
- GCC:「海灣合作委員會(Ubuntu的/ Linaro的4.8.1 -10ubuntu9)4.8.1" (套餐五: 「4.8.1-2ubuntu3」)
- (我的資料庫是那些默認提供的Linux Mint的16)
一些更多的Informa公司以下答案來自@Sean Perry:
1:似乎追加選項-O0不會更改調試器的行爲。
2:我也嘗試使用下面的僞代碼,而不是我以前的一個
#include <stdlib.h>
#include <stdio.h>
int main(void) {
long a = 1;
long b = 2;
long c = 0;
c = a + b;
c += (long) &c;
printf("c = %ld\n", c);
return 0;
}
我不能肯定這就是@Sean佩裏的「使用指針」的意思,但我想它必須防止因爲變量c的地址(或多或少)會隨着二進制文件的每次運行而隨機更改,所以無論如何都要進行代碼優化。
3:最後,我注意到一些有趣的事情:
- 用gcc編譯[-g -O0]然後用gdb調試:工作
- 用gcc編譯[-g -O0]然後用LLDB調試:不工作
- 鏗鏘編譯[-g -O0]然後用gdb調試:工作
- 鏗鏘編譯[-g -O0]然後用LLDB調試:工作
編輯1:回覆@SeanPerry edit2:區分軟件版本和軟件包版本
我試過複製粘貼你的確切代碼,並用'Ubuntu 4.8.2-19ubuntu1'和'Ubuntu/Linaro 4.7.3-12ubuntu1'編譯它,並試着用lldb-3.4([stable branch] (http://llvm.org/apt/)),它的工作(即'(lldb)打印c'導致'(int)$ 0 = 3') – Scis
@Scis:Awkward ...你在32位或64位機器上? (只是想知道在我使用的64位版本的gcc中是否會出現一個小故障)。我的gcc版本是Ubuntu/Linaro 4.8.1-10ubuntu9,我的lldb版本是「lldb 3.4版(修訂版)」。 我有點困惑這是一個穩定還是不穩定的構建......一方面,我的倉庫中的lldb包被標記爲「svn」,另一方面我安裝了它,輸入「aptitude install lldb- 3.4「,這正是您在[link](http://llvm.org/apt/)上建議我閱讀的頁面上給出的說明。你知道我能找到這個嗎? –
我使用的是64位ubuntu 14.04 LTS。至於安裝,似乎我們都以同樣的方式安裝它(按照建議安裝'clang-3.4'的方式?嘗試再次運行'apt-get install clang-3.4 lldb-3.4'也許有一些版本不匹配 - 這當然只是一個猜測,但這又是一個奇怪的行爲) – Scis