如何在Docker内部使用gdb调试器

如何在Docker内部使用gdb调试器,第1张

前几天一个小伙伴发邮件问我,他在docker内部使用gdb调试时刻遇到了gdb如下报错信息

ptrace:Operation not permitted

当时我的答复是在docker create或者docker run时刻开启 万精油--privileged参数 。小伙伴的问题就此解决了。

但是事实并非如此简单

Docker借用了linux对进程设置capabilities,而其子进程继承父进程capabilites特性来完成对容器capacities的控制。Docker create和docker run参数中有下面两个参数可以对容器默认的capabilites进行修改:

--cap-add //添加某个capabilites属性 --cap-del //剔除某个默认的capabilites属性

cap-add和cap-del可以设置的参数可以通过下面链接查询到:

>

调试时,应用程序在嵌入式目标系统上运行,而gdb调试在Host端。 一、编译安装gdb+gdbserver 首先下载gdb源码,我下载的是gdb-66targz。$tar xvzf gdb-66targz$mkdir mygdb$cd mygdb必须要在你想要安装的目录下执行下边的命令。$/gdb-66/configure --target=arm-linux \ --prefix=/home/a/mygdb参数说明:target是你的目标板,我的是arm-linux,prefix是你要安装的目标文件夹。$make$make install然后建立gdbserver。$mkdir mygdbserver$cd mygdbserver$chmod +x /gdb-66/gdb/gdbserver/configure$CC=arm-linux-gcc /gdb-66/gdb/gdbserver/configure \--host=arm-linux --prefix=/home/a/mygdbserver$make$make install$arm-linux-strip gdbserver去除调试信息。不去好像不行,我的就不行,去了就ok了。复制到你的开发板上就可以了。 二、调试步骤1、交叉编译,带参数-g加入调试信息。假设要调试的程序为testc。#arm-linux-gcc -g testc -o test2、在Target Board开启gdbserver#gdbserver <host-ip>:2345 testgdbserver开始监听2345端口(你也可以设其他的值),然后启动test,你会看到“Process test created:pid=88”3、回到Host端#arm-linux-gdb test最后一行显示:This GDB was configured as “--host=i686-pc-linux-gnu,--target=arm-linux”说明此gdb在X86的Host上运行,但是调试目标是ARM代码。(gdb)target remote <target-board-ip>:2345注意:你的端口号必须与gdbserver开启的端口号一致,这样才能进行通信。建立链接后,就可以进行调试了。调试在Host端,跟gdb调试方法相同。注意的是要用“c”来执行命令,不能用“r”。

int argc,char argv

agrc表示参数的个数

argv储存参数

这个函数的意思是逐一输出参数

实际上,main函数也可以带参数。带参数main函数的定义格式如下:

void main(int argc, char argv[])

{

}

argc和argv是main函数的形式参数。这两个形式参数的类型是系统规定的。如果main函数要带参数,就是这两个类型的参数;否则main函数就没有参数。变量名称argc和argv是常规的名称,当然也可以换成其他名称。

那么,实际参数是如何传递给main函数的argc和argv的呢?我们知道,C程序在编译和链接后,都生成一个exe文件,执行该exe文件时,可以直接执行;也可以在命令行下带参数执行,命令行执行的形式为:

可执行文件名称 参数1 参数2 参数n

可执行文件名称和参数、参数之间均使用空格隔开。例如,我们在DOS下运行copy c:\testtxt d:\testtxt,可执行文件名称为copy,参数1为字符串“c:\testtxt”,参数2为“d:\testtxt”。结果copy命令将c:\testtxt拷贝到d盘,目标文件取为testtxt。

如果按照这种方法执行,命令行字符串将作为实际参数传递给main函数。具体为:

(1) 可执行文件名称和所有参数的个数之和传递给argc;

(2) 可执行文件名称(包括路径名称)作为一个字符串,首地址被赋给argv[0],参数1也作为一个字符串,首地址被赋给argv[1], 依次类推。

例如,现在运行命令行(test是编译后的exe文件名称):

C:\TC\test how are you

那么test工程的main函数参数argc=4;

argv[0]将保存字符串"C:\TC\test"的首地址;

argv[1]将保存字符串"how"的首地址;

argv[2]将保存字符串"are"的首地址;

argv[3]将保存字符串"you"的首地址;

下面的例子打印所有的argv参数:

main(int argc, char argv[])

{

int i;

printf("\nTotal %d arguments",argc);

for(i=0;i<argc;i++)

{

printf("\nArgument %d = %s ",i+1, argv[i]);

}

}

如果编译后的exe文件名称为test,在DOS下运行C:\TC\test how are you,结果输出:

Total 4 arguments

Argument 1 = C:\TC\testexe

Argument 2 = how

Argument 3 = are

Argument 4 = you

我们也可以在调试状态下输入命令行参数,方法是:

在TurboC的Options菜单下有一个子菜单Arguments,选择该项并确定,d出输入窗口;在输入窗口键入命令行参数即可。比如要调试上述的test,可以在输入窗口键入how are you。在调试过程中,可执行文件名称和参数字符串将被传递给main函数的形式参数。

在DOS系统下,人们常常希望在运行exe的同时,传递一些有用的信息。例如copyexe,运行时将源文件名称和目的文件名称作为参数传入。利用指针数组argv作为main函数的形式参数,可以满足这种需要。

以上就是关于如何在Docker内部使用gdb调试器全部的内容,包括:如何在Docker内部使用gdb调试器、gdb怎么用、开发板上如何使用GDB等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9390468.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存