gdb如何編譯run
① linux 下用gdb進行調試.c程序,執行run命令時提示許可權不夠,怎麼辦
.c是源文件,不是程序,沒有可執行許可權,所以不能用來調試。
應該先用gcc來編譯,編譯之後的程序就具有可執行許可權的。
如果我們想用來調試,比如1.c,可以這樣
gcc 1.c -o 1.out -g
然後
gdb 1.c
gdb的用法自己再去找詳細資料吧,一般會用l(list,列出源代碼),b(break,設置斷點),r(run,運行文件)就可以了。
② linux,gdb,編譯,-g高手請進~~
找makefile gcc /g++ 的位置,一般會有
CC = gcc (或者CC = g++)
之類的賦值操作。
你在後面加上-g
CC = gcc -g
另外要搜一下有沒有優化選項-O 去掉它。
或者make的時候試試make CFLAGS=-g
記得先make clean
③ 如何使用gdb調試android程序
用gdb調試動態鏈接庫
大家都知道在 Linux 可以用 gdb 來調試應用程序,當然前提是用 gcc 編譯程序時要加上 -g 參數。
我這篇文章里將討論一下用 gdb 來調試動態鏈接庫的問題。
首先,假設我們准備這樣的一個動態鏈接庫:
引用:
庫名稱是: ggg
動態鏈接庫文件名是: libggg.so
頭文件是: get.h
提供這樣兩個函數調用介面:
int get ();
int set (int a);
要生成這樣一個動態鏈接庫,我們首先編寫這樣一個頭文件:
/************關於本文檔********************************************
*filename: get.h
*********************************************************************/
int get ();
int set (int a);
然後准備這樣一個生成動態鏈接庫的源文件:
/************關於本文檔********************************************
*filename: get.cpp
*********************************************************************/
#include
#include "get.h"
static int x=0;
int get ()
{
printf ("get x=%d\n", x);
return x;
}
int set (int a)
{
printf ("set a=%d\n", a);
x = a;
return x;
}
然後我們用 GNU 的 C/C++ 編譯器來生成動態鏈接庫,編譯命令如下:
引用:
g++ get.cpp -shared -g -DDEBUG -o libggg.so
這樣我們就准備好了動態鏈接庫了,下面我們編寫一個應用程序來調用此動態鏈接庫,源代碼如下:
/************關於本文檔********************************************
*filename: pk.cpp
*********************************************************************/
#include
#include "get.h"
int main (int argc, char** argv)
{
int a = 100;
int b = get ();
int c = set (a);
int d = get ();
printf ("a=%d,b=%d,c=%d,d=%d\n",a,b,c,d);
return 0;
}
編譯此程序用下列命令,如果已經把上面生成的 libggg.so 放到了庫文件搜索路徑指定的文件目錄,比如 /lib 或 /usr/lib 之類的,就用下面這條命令:
引用:
g++ pk.cpp -o app -Wall -g -lggg
否則就用下面這條命令:
引用:
g++ pk.cpp -o app -Wall -g -lggg -L`pwd`
下面我們就開始調試上面命令生成的 app 程序吧。如果已經把上面生成的 libggg.so 放到了庫文件搜索路徑指定的文件目錄,比如 /lib 或 /usr/lib 之類的,調試就順利完成,如下:
引用:
#gdb ./app
GNU gdb 6.4-debian
Copyright 2005 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show ing" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".
(gdb) b main /* 這是在程序的 main 處設置斷點 */
Breakpoint 1 at 0x804853c: file pk.cpp, line 7.
(gdb) b set /* 這是在程序的 set 處設置斷點 */
Function "set" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y /* 這里必須選擇 y 調試程序才會跟蹤到動態鏈接庫內部去 */
Breakpoint 2 (set) pending.
(gdb) run /* 開始運行我們的程序,直到遇見斷點時暫停 */
Starting program: /data/example/c/app
Breakpoint 3 at 0xb7f665f8: file get.cpp, line 11.
Pending breakpoint "set" resolved
Breakpoint 1, main (argc=1, argv=0xbfArrayArray0504) at pk.cpp:7
7 int a = 100;
(gdb) n /* 繼續執行程序的下一行代碼 */
8 int b = get ();
(gdb) n /* 程序執行到了我們斷點所在的動態鏈接庫了 */
get x=0
Array int c = set (a);
(gdb) n
Breakpoint 3, set (a=100) at get.cpp:11
11 printf ("set a=%d\n", a);
(gdb) list /* 查看當前代碼行周圍的代碼,證明我們已經跟蹤到動態鏈接庫的源代碼裡面了 */
6 printf ("get x=%d\n", x);
7 return x;
8 }
Array int set (int a)
10 {
11 printf ("set a=%d\n", a);
12 x = a;
13 return x;
14 }
(gdb) n
set a=100
12 x = a;
(gdb) n
13 return x;
(gdb) n
14 }
(gdb) n
main (argc=1, argv=0xbfArrayArray0504) at pk.cpp:10
10 int d = get ();
(gdb) n
get x=100
11 printf ("a=%d,b=%d,c=%d,d=%d\n",a,b,c,d);
(gdb) n
a=100,b=0,c=100,d=100
12 return 0;
(gdb) c
Continuing.
Program exited normally.
(gdb) quit /* 程序順利執行結束 */
如果我們沒有把動態鏈接庫放到指定目錄,比如/lib裡面,調試就會失敗,過程如下:
引用:
# gdb ./app
GNU gdb 6.4-debian
Copyright 2005 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show ing" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".
(gdb) b main
Breakpoint 1 at 0x804853c: file pk.cpp, line 7.
(gdb) b set
Function "set" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 2 (set) pending.
(gdb) run /* 雖然調試操作都一樣,但程序執行失敗 */
Starting program: /data/example/c/app
/data/example/c/app: error while loading shared libraries: libggg.so: cannot open shared object file: No such file or directory
Program exited with code 0177.
(gdb) quit
④ gdb怎麼用
GDB調試,建議去下個系統的文檔;
GDB調試器
GCC用於編譯程序,而Linux的另一個GNU工具gdb則用於調試程序。gdb是一個用來調試C和C++程序的強力調試器,我們能通過它進行一系列調試工作,包括設置斷點、觀查變數、單步等。
其最常用的命令如下:
file:裝入想要調試的可執行文件。
kill:終止正在調試的程序。
list:列表顯示源代碼。
next:執行一行源代碼但不進入函數內部。
step:執行一行源代碼而且進入函數內部。
run:執行當前被調試的程序
quit:終止gdb
watch:監視一個變數的值
break:在代碼里設置斷點,程序執行到這?鍤憊移?
make:不退出gdb而重新產生可執行文件
shell:不離開gdb而執行shell
2)從你的描述上看來,你是用單獨的gdb.exe調試器,調試的時候不需要運行程序的,編譯的時候 只要加上相應的參數(」-g「)產生編譯後的可執行文件,
以gcc編譯sum.c(加-g選項產生debug信息):
gcc –g –o sum sum.c
在命令行上鍵入gdb sum並按回車鍵就可以開始調試sum了,再運行run命令執行sum。
⑤ GDB ROS調試
ROS中用到第三方庫,在編譯第三方庫的時候,加上 -g 選項,以供芹困調用該庫時調試。
在編譯ROS包的時候,使用如下命令編譯:
catkin_make -DCMAKE_BUILD_TYPE=Debug
GDB啟嫌頌念動應用
rosrun --prefix 'gdb -ex run --args' 櫻余 package node
之後就可以正常使用GDB命令來調試了,因為第三方庫編譯加了 -g 選項,所以可以進入調用庫中的函數進行調試。
⑥ Linux的調試工具gdb怎麼重新開始運行程序
gdb好像沒有重新運行程序的命令吧,如果需要重新運行程序,先quit退出gdb,再重新調試不就行了。