我正在try 编写一个C程序,以便使用GBD MI protocol与gdb交互.

首先,我试着自己处理子流程,但我资助了项目subprocess.h,并开始使用它.

在下面的程序中,我可以产生新的进程,读取stdoutstderr,但当我试图发送东西到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来说,它会有很大帮助.

推荐答案

从fprint tf获得返回值,可以看到18个字节被写入文件句柄p_stdin,但我没有得到任何响应.

subprocess.h似乎没有设置任何缓冲,它的文档甚至没有mention缓冲.

默认情况下,管道上的stdiofully buffered,您需要调用fflush(p_stdin)才能将命令实际发送给子进程.

C++相关问答推荐

是否可以在C中进行D3 D12申请?

Pure Win32 C(++)-除了替换控件的窗口程序之外,还有其他方法可以在输入时禁用按钮吗?

C指针地址和转换

当多个线程在C中写入相同的文件描述符时,如何防止争用情况?

从组播组地址了解收到的数据包长度

GCC引发不明确的诊断消息

模拟shell并运行.sh文件

初始变量重置后,char[]的赋值将消失

进程在写入管道时挂起

使用错误的命令执行程序

为什么将函数名括在括号中会禁用隐式声明?

如何只获取字符串的第一个单词,然后将其与c中的另一个单词进行比较?

获取前2个连续1比特的索引的有效方法

将数组插入数组

为什么realloc函数在此代码中修改变量?

C";中的ANN运行时判断失败#2-变量outputLayer;周围的堆栈已损坏.运行后出错

宏观;S C调深度

';malloc():损坏的顶部大小';分配超过20万整数后

如何修复数组数据与列标题未对齐的问题?

React Native Android C++ TurboModules 静态 C 库链接问题