我正在try 编写一个C程序,以便使用GBD MI protocol与gdb交互.
首先,我试着自己处理子流程,但我资助了项目subprocess.h,并开始使用它.
在下面的程序中,我可以产生新的进程,读取stdout
和stderr
,但当我试图发送东西到stdin是不工作.
从fprintf
返回,可以看到18个字节被写入文件句柄p_stdin,但我没有得到任何响应.有没有办法判断标准输入句柄是否正确?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <time.h>
#define BUFFER_SIZE 32
#include "subprocess.h"
int main(void) {
const char *command_line[] = {"gdb", "--nx", "-quiet","--interpreter=mi3", NULL};
struct subprocess_s gdb_sp;
printf("Starting new process\n");
int gdb_status = subprocess_create(command_line, subprocess_option_search_user_path | subprocess_option_inherit_environment , &gdb_sp);
if(gdb_status != 0) {
fprintf(stderr, "Erro: can't open GDB, check if its is installed\n");
return -1;
}
printf("Started\n");
FILE *p_stdout = subprocess_stdout(&gdb_sp);
FILE *p_stderr = subprocess_stderr(&gdb_sp);
char stdout_buf[BUFFER_SIZE];
char stderr_buf[BUFFER_SIZE];
memset(stdout_buf, 0, sizeof(stdout_buf));
memset(stderr_buf, 0, sizeof(stderr_buf));
fgets(stdout_buf, BUFFER_SIZE, p_stdout);
printf("%s", stdout_buf);
fgets(stdout_buf, BUFFER_SIZE, p_stdout);
printf("%s", stdout_buf);
FILE *p_stdin = subprocess_stdin(&gdb_sp);
int a = fprintf(p_stdin, "-break-insert main");
printf("%d\n", a);
fgets(stdout_buf, BUFFER_SIZE, p_stdout);
printf("%s", stdout_buf);
int ret = -1;
subprocess_join(&gdb_sp, &ret);
if(ret != 0 ) {
fprintf(stderr, "Erro: can't join GDB process!\n");
return -1;
}
assert(!subprocess_destroy(&gdb_sp));
printf("Press KEY to exit!");
getchar();
return EXIT_SUCCESS;
}
如果你想在你的机器上运行,把上面的代码和subprocess.h放在同一个文件夹里,你可以使用下面的CMakeLists.txt来编译.
cmake_minimum_required(VERSION 3.0)
project(gdb-mi)
set (CMAKE_C_STANDARD 99)
file(GLOB PROJECT_HEADERS *.h)
file(GLOB PROJECT_SOURCES *.c)
source_group("headers" FILES ${PROJECT_HEADERS})
source_group("sources" FILES ${PROJECT_SOURCES})
add_definitions(-DPROJECT_SOURCE_DIR=\"${PROJECT_SOURCE_DIR}\")
add_executable(${PROJECT_NAME} ${PROJECT_SOURCES} ${PROJECT_HEADERS})
set_target_properties(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${PROJECT_NAME})
测试对象:
- 无效的linux:GCC 12.2.0
- WSL2Ubuntu 20.04:GCC 9.4.0
- Windows 11:MSVC 19.38.33134.0
我希望能够用C语言以一种简单的方式与GDB交互,如果你有一个很好的例子来说明如何进行这种交流,对于Linux和Windows来说,它会有很大帮助.