前几天一个小伙伴发邮件问我,他在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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)