RISC-V 中的 GDB 是否支持程序上下文感知断点?

Does GDB in RISC-V support Program Context aware breakpoint?

我想了解现有的 RISC-V GDB 是否支持程序上下文感知断点?

通过程序上下文感知断点:我的意思是,当有 JAL 或 JALR 指令时,当有函数调用时 PC 会发生变化。在其他情况下函数调用 ==> PC = PC + (Current Program Counter + 4) 在函数 Return 中:PC = PC - (Return 地址 (ra 寄存器值)).

我已经在我的 ubuntu(虚拟机)上安装了 fedora(risc-V)。由于它是虚拟机,我无法打印 PC 寄存器值,这就是为什么我无法检查它是否支持 Program Context 感知断点?

我的第二个问题是:如何在我的 qemu risc-v 虚拟机上打印 PC 寄存器值?

#include<stdio.h>

int check_prime(int a)
{
int c; 
    for (c=2;c<a;c++)
    {
        if (a%c == 0 ) return 0; 
        if (c == a-1 ) return 1; 
    }
}

void oddn(int a)
{
    printf("oddn --> %d is an odd number \n",a);
    if (check_prime(a)) printf("oddn --> %d is a prime number\n",a);
}

int main()
{
    int a;
    a=7;
    if (check_prime(a)) printf("%d is a prime number \n",a);
        if (a%2==1) oddn(a);    

}

这是我尝试使用 GDB 设置断点的程序。

正如您在图片上看到的那样,它断裂了两次(应该只断裂 一次)。 它还会给出错误:

Error in testing breakpoint condition:
Invalid data type for function to be called

这里记录了您要查找的内容:

https://sourceware.org/gdb/current/onlinedocs/gdb/Convenience-Funs.html#index-_0024_005fstreq_002c-convenience-function

你应该看看 $_caller_is$_caller_matches$_any_caller_is$_any_caller_matches

例如,要检查直接调用者是否是特定函数,我们可以这样做:

break functionD if ($_caller_is ("functionC"))

那么main -> functionD不会触发断点,而main -> functionC -> functionD会触发断点。

我列出的便利函数都采用帧偏移量,可用于指定 GDB 将检查的帧(对于 $_caller_is$_caller_matches)或限制检查的帧范围(对于$_any_caller_is$_any_caller_matches).