根据pc值判断段错误位置

img

30 static inline unsigned long __my_cpu_offset(void)
31 {
32 unsigned long off;
33
34 /*
35 * Read TPIDRPRW.
36 * We want to allow caching the value, so avoid using volatile and
37 * instead use a fake stack read to hazard against barrier().
38 */
39

这有什么问题?

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    对于如何根据pc值判断段错误的位置,可以使用以下步骤:

    1.开启段错误提示功能,可以使用以下代码:

    #include <signal.h>
    
    void segv_handler(int sig) { // SIGSEGV handler function
        printf("Caught signal %d\n", sig);
        exit(sig);
    }
    
    int main() {
        signal(SIGSEGV, segv_handler); // register SIGSEGV handler
        ...
    }
    

    2.编译代码时添加-g选项,生成调试信息。

    3.使用gdb调试器来定位段错误的位置,具体步骤如下:

    (1)在终端中进入程序所在路径,输入gdb空格程序名,打开gdb调试器。

    (2)输入run命令,运行程序。

    (3)当程序崩溃时,gdb会停止程序,并提示发生了段错误,此时输入backtrace命令,可以查看程序堆栈信息,找到引起段错误的函数调用链。

    (4)使用print命令打印变量值来查看变量是否异常,使用step命令单步执行程序,查看程序执行过程。

    (5)根据调试信息结合程序源代码,找到引起段错误的代码,并进行修改。

    4.按照以上步骤定位并修复段错误,最后重新编译程序进行测试。

    对于代码中缺少部分的问题,可以根据函数的功能和整段代码的逻辑进行推断修改。具体可以在33行添加相应的代码,确保代码逻辑正确,没有潜在的段错误位置。在修改代码时,也可以使用第3步中的gdb调试器来验证代码正确性。如果无法确定该如何修改代码,可以请教其他专家或咨询相关技术论坛。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^