*********gdb 的常用命令*************** 命令 解释 break NUM 在指定的行上设置断点。 BT 显示所有的调用栈帧。该命令可用来显示函数的调用顺序。 clear 删除设置在特定源文件、特定行上的断点。其用法为:clear FILENAME:NUM。 continue 继续执行正在调试的程序。该命令用在程序由于处理信号或断点而 导致停止运行时。 display EXPR 每次程序停止后显示表达式的值。表达式由程序定义的变量组成。 file FILE 装载指定的可执行文件进行调试。 help NAME 显示指定命令的帮助信息。 info break 显示当前断点清单,包括到达断点处的次数等。 info files 显示被调试文件的具体信息。 info func 显示所有的函数名称。 info local 显示当函数中的局部变量信息。 info prog 显示被调试程序的执行状态。 info var 显示所有的全局和静态变量名称。 kill 终止正被调试的程序。 list 显示源代码段。 make 在不退出 gdb 的情况下运行 make 工具。 next 在不单步执行进入其他函数的情况下,向前执行一行源代码。 print EXPR 显示表达式 EXPR 的值。
if (argc < 2) { printf ("Usage: %s n/n", argv [0]); return -1; } else { n = atoi (argv[1]); printf ("Factorial of %d is %d./n", n, factorial (n)); }
return 0; } ----------------------- 利用如下的命令可编译生成可执行文件,并执行程序: $ gcc -o factorial main.c factorial.c $ ./factorial 5 Factorial of 5 is 120.
GCC 可同时用来编译 C 程序和 C++ 程序。一般来说,C 编译器通过源文件的后缀名来判定是 C 程序还是 C+ + 程序。在 linux 中,C 源文件的后缀名为 .c,而 C++ 源文件的后缀名为 .C 或 .cpp。 但是,gcc 命令只能编译 C++ 源文件,而不能自动和 C++ 程序使用的库连接。因此,通常使用 g++ 命令来完 完成 C++ 程序的编译和连接,该程序会自动调用 gcc 实现编译。 假设我们有一个如下的 C++ 源文件(hello.C):
以下是dbxtra基本命令: c cont 在断点后继续执行 d delete 删除所设断点 h help 帮助 e edit 编辑源程序 n next 源程序区的内容向下翻一屏。 p print 显示变量 q quit 退出dbxtra r run 运行程序,直到遇上设置的断点 rr rerun 再次运行 s step 单步运行 st stop 设置断点 j status 显示当前断点 t where 显示当前状态,列出所有设置的变量值 di display 开显示窗,用于查看变量 ud undisplay 删除显示窗的条目 f forward 源程序区的内容向上 翻一屏。 B backward 源程序区的内容向下 翻一屏。 Stopi stop inst 设置断点 tracei trace inst跟踪子程序
首先带上-g参数编译 cc -g -o t t.c 启动调试器 dbxtra t 屏幕显示: 1.main() 2.{ int i=10 ,*p1; 3. float j=1.5,*p2; 4. p1=& 5. p2=& 6. p2=p1; 7. printf("%d,%d/n",*p1,*p2); 8.} C[browse] File:t.c Func.- Readubg symbolic information Type 'help' for help (dbxtra) (dbxtra)
设置断点:
(dbxtra)stop at 5 运行: (dbxtra) run 程序自动在第5行停下。 这时我们可以看变量的值。 (dbxtra) print *p1
LD_AOUT_PRELOAD 除了不使用 a.out 二进制格式外,与 LD_PRELOAD 相同。 LD_KEEPDIR 只适用于 a.out 库;忽略由它们指定的目录。 LD_LIBRARY_PATH 将其他目录加入库搜索路径。它的内容应该是由冒号 分隔的目录列表,与可执行文件的 PATH 变量具有相同的格式。 假如调用设置用户 ID 或者进程 ID 的程序,该变量被忽略。 LD_NOWARN 只适用于 a.out 库;当改变版本号是,发出警告信息。 LD_PRELOAD 首先装入用户定义的库,使得它们有机会覆盖或者重新定义标准库。 使用空格分开多个入口。对于设置用户 ID 或者进程 ID 的程序, 只有被标记过的库才被首先装入。在 /etc/ld.so.perload 中指定 了全局版本号,该文件不遵守这个限制。
4. 使用 dlopen
另外一个强大的库函数是 dlopen()。该函数将打开一个新库,并把它装入内存。该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的。比如 Apache Web 服务器利用这个函数在运行过程中加载模块,这为它提供了额外的能力。一个配置文件控制了加载模块的过程。这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了。