sda*_*aau 0 c linux shell environment gdb
对不起,如果问题措辞错误 - 我不知道我要求的正确的词!:)
说,你有一些简单的C程序,如:
#include <stdio.h>
int main()
{
int a=2;
printf("Hello World %d\n", a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
通常,这必须保存在文件中(例如hello.c); 然后我们运行gcc源文件并获取可执行文件 - 如果我们编译了调试信息,那么我们可以使用gdb可执行文件,逐步执行代码行,并检查变量.
我想拥有的,基本上是某种"C"shell - 类似于Python shell; 从某种意义上说,我可以在一个文件(脚本)中有一系列Python命令 - 或者我可以在shell中粘贴相同的命令,然后它们将执行相同的命令.关于上面的简单程序,这是我希望能够做到的(C>代表想象的提示):
C> #include <stdio.h>
(stdio.h included)
C> int a=2;
C> printf("Hello World %d\n", a);
Hello World 2
C>
Run Code Online (Sandbox Code Playgroud)
换句话说,我希望能够以交互方式执行单独的C命令(我猜这会代表各种类型的动态编译?).最初我被C shell(csh)的名称误导了- 但我不认为它能够动态执行C命令.
所以,首先,我想知道是否有可能以某种方式说服gdb以这种方式执行?如果没有,还有什么可以让我做类似的事情(也许是一些特殊的外壳)?
至于上下文 - 我有一些代码,我有问题排除结构之间的指针等; 这里gdb打印输出结构的方式非常好 - 但是,为了隔离问题,我必须制作新的源文件,粘贴数据,重新编译和调试.在这种情况下,我宁愿有某种壳的贴几个结构(和它们的初始化命令)的可能性-然后,检查使用printf(甚至更好,一个类似于gdb的print)直接输入上壳.
只是为了记录 - 我真的没有说服这样的东西真的存在; 但我想我还是会问:)
提前感谢任何答案,
干杯!
编辑:我有点忙,所以没有时间审查所有的答案还可以接受(对不起:)); 只是想添加一点评论:" 解释与机器代码 "; 或者如@doron所说:
以交互方式运行C/C++源的问题是编译器无法对代码执行逐行解释.
我完全清楚这一点 - 但是让我们想象一下命令行应用程序(甚至可以是一个解释的应用程序),它会给你一个命令行界面的提示.首先,让我们假设这个应用程序在内存中生成这个简单的"文本文件":
@@HEADER@@
int main()
{
@@MAIN@@
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后,应用程序只需等待在提示符下输入文本,然后按ENTER键; 并在新的一行:
#define或开头#include,则将其添加到临时文件中@@HEADER@@- 但int main()在行上方-@@MAIN@@行 - 但return 0;在行上方@@HEADER@@并删除@@MAIN@@行,并保存到磁盘中temp.cgcc被调用来编译temp.c并生成temp.out可执行文件
gdb调用以运行temp.out可执行文件,并在该return 0;行
设置断点gdb(因此用户可以使用命令p variable来检查) - 直到用户按下,例如,Ctrl + 1退出gdbgdb退出,控制返回到我们的应用程序 - 它等待下一个代码行重新等等
显然,我不希望能够将整个Linux内核代码粘贴到这样的应用程序中,并期望它能够工作:)但是,我希望能够粘贴几个structs,并检查声明的结果,如:
char dat = (char) (*(int16_t*)(my->structure->pdata) >> 32 & 0xFF) ^ 0x88;
Run Code Online (Sandbox Code Playgroud)
...所以我确定使用的正确语法是什么(通常是我搞砸了) - 没有重建和调试整个软件的开销,只是为了弄清楚我是否应该移动右括号在星号之前或之后(当然,当这样的动作没有引起编译错误的情况下).
现在,我不确定上述简单应用程序架构可能产生的整个问题范围.但是,这是一个例子,它只是指出像"C shell"(对于相对简单的会话/程序)这样的东西在概念上是可行的,通过使用gcc和gdb- 没有任何严重的冲突,否则,严格区分'机器代码'和'解释'语言.