gdb是Linux操作系统下基于命令行的程序调试工具。以C++为例,测试程序为test.cpp,通过makefile或者命令gcc生成可执行文件test://-g为了调试用的 ,加个-g 是为了gdb 用,不然gdb用不到
//-o output_filename,确定输出文件的名称为output_filename,不能和源文件同名
//-c 只编译不链接,生成目标文件而不是可执行文件
gcc -g test.cpp -o test
启动gdb:gdb test//不打印gdb版本信息
gdb -q test//打印gdb版本信息
查看代码:l...
1 制作initramfsinitramfs.cpio2 qemu快速启动linux kernelqemu-system-x86_64 -kernel bzImage -initrd initramfs.cpio -s -S3 gdb clientgdb vmlinux(gdb) target remote:1234(gdb)b start_kernel(gdb) c然后就挂住了。 原文:https://www.cnblogs.com/hustdc/p/8146135.html
from test...done.
(gdb)
有没有觉得这个世界一下子清净了许多。
也可以先进入gdb模式,然后再加载文件。wang@king:~$ gdb -q
(gdb) file test
Reading symbols from test...done.
(gdb) 好了,现在开始调试了,但是我还想看看我的代码怎么办,gdb提供了一条命令,可以让你的程序显示出来。(gdb) //list默认一次显示10行
1 #include<stdio.h>
2 int func(int n)
3 {
4 in...
设要调试的文件是 bug.c
先用 gcc -o bug -ggdb bug.c 生成可执行文件
输入 gdb bug //bug是待调试的可执行文件的名字
输入 list(简写为l) 可查看源代码
输入 run(简写r) 运行程序
输入 where 查看程序出错位置
输入 pirnt(简写p) 后面跟变量名 查看变量的值
输入 quit 退出GDB调试器【linux】gdb调试标签:本文系统来源:http://www.cnblogs.com/dplearning/p/4670700.html
以前在IDE调试的话,就很容易设置断点,查看参数值,到了 linux 下就变得比较麻烦了。
目前觉得比较重要的就是:
1.设置断点:
gdb命令 break,也可以用 b 。 方法 b [函数名|行号],需要注意的是,如果你要设置在类成员函数中设置断点,要加上类名,比如 b TcpClient::onMessage,再接着,如果用 namespace 要加上 namespace。
比如, b cyc::TcpClient::onMessage
2.查看参数
gdb命令 print,也可以 p。方法 p para.显示一次。...
exbot@ubuntu:~/CodeLearn/HelloWorld/src$ g++ -g main.cpp2 exbot@ubuntu:~/CodeLearn/HelloWorld/src$ ./a.out3 Hello world!104 exbot@ubuntu:~/CodeLearn/HelloWorld/src$ gdb a.out5 GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.046 Copyright (C) 2012 Free Software Foundation, Inc.7 License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>8 This is free software: you are fre...
/etc/profile
Shift + G
i
# No core files by default 0, unlimited is oo
ulimit -S -c unlimited > /dev/null 2>&1
wq!source /etc/profile上面shell 操作是 在 /etc/profile 最后一行添加 上面设置全局开启 core文件调试,大小不限. 最后 立即生效.
再跟着我做, 因为生成的core文件同名会覆盖. 这里为其加上一个 core命名规则, 让其变成 [core.pid] 格式.su rootvi /etc/sysctl.conf
Shift + G
i# open, add core.pid
kernel.c...
(gdb) l
1 #include<iostream>
2 using namespace std;
3 int sum(int arg1,int arg2)
4 {
5 return arg1+arg2;
6 }
7 int main()
8 {
9 int a=1;
10 int b=2;
(gdb)
11 cout<<"sum = "<<sum(a,b)<<endl;
12 return 0;
13
14 }
(gdb)
(gdb) n表示next单步进行
Breakpoint 1, main () at sum.cpp:1111 cou...
GDB是一套字符界面的程序集,可以用它在linux上调试C和C++程序,它提供了以下的功能:
1 在程序中设置断点,当程序运行到断点处暂停
2 显示变量的值,可以打印或者监视某个变量,将某个变量的值显示出来
3 单步执行
4 运行时修改变量的值
5 跟踪路径
6 线程切换
等等
下面以以下程序为例当我们要使用GDB进行程序的调试时,在用GCC编译时需要加上-g,如下:GDB之所以能够进行程序的调试也是在于进行编译时的-g选项,当设置了这个选...
install openssh-server2.安装g++:yum install gcc-c++3.安装gdb+gdbserver
此处需要下载gdb安装包 gdb-7.12.tar.gz,地址: http://ftp.gnu.org/gnu/gdb/
下载完成后,将压缩文件上传到Linux主机目录/home/tbcs/gdb
然后登录Linux主机,打开安装包所在目录,解压缩:tar -zxvf gdb-7.12.tar.gz解压后会出现 gdb-7.12 文件目录,进入此目录,执行如下命令:./configure然后执行make命令:make然后进行安装:make install完成后,...
今天我最终忍受不了qemu的低速跟不可理喻的各种bug,開始寻找新的调试内核的方法。然后想到了Vmware,那么成熟的虚拟机怎么可能调试不了内核。于是尝试了一番,发现结果很的棒!所以立刻奋笔疾书。把这种方法记录下来。
我们这里主要分成几个步骤:
1、vmware和linux的安装
2、vmware编译Linux内核
...
一、GDB调试命令 描述backtrace(或bt)查看各级函数调用及参数finish连续运行到当前函数返回为止,然后停下来等待命令frame(或f) 帧编号选择栈帧info(或i) locals查看当前栈帧局部变量的值list(或l)列出源代码,接着上次的位置往下列,每次列10行list 行号列出从第几行开始的源代码list 函数名列出某个函数的源代码next(或n)执行下一行语句print(或p)打印表达式的值,通过表达式可以修改变量的值或者调用函数quit(或q)...
Linux 下运行C++项目中遇到Segmentation fault 这样的问题,往往不会有太多错误信息,通常需要GDB来调试
1、编译Debug版本 make debug
2、生成最新版本的core文件,如果有core文件,rm。ulimit -c unlimited-c 后面加的参数是:1)使用ulimit -c命令可查看core文件的生成开关。若结果为0,则表示关闭了此功能,不会生成core文件。 2)使用ulimit -c filesize命令,可以限制core文件的大小(filesize的单位为kbyte)。若ulim...
PC应用程序gdb调试:
1、查看core文件参数 yinkui@yinkui-desktop:~/File_unzip/cp_module$ ulimit -a
core file size (blocks, -c) 0 //产生core文件数目,不会产生core文件data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 31042 max locked memory (kbytes, -l) 64 max ...
,而不能同时跟踪多个进程,但可以设置gdb在fork之后跟踪父进程还是子进程。以上面的程序为#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#define MAXLINE 80int main(void)
{int n;int fd[2];pid_t pid;char line[MAXLINE];if (pipe(fd) < 0){ perror("pipe");exit(1);} if ((pid = fork()) < 0){ perror("fork");exit(1);} if (pid > 0) /* parent */{ close(fd[0]);write(fd[1], "hello world\n", 1...