Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 获取进行(非法)内存访问的函数名_C_Memory_Signals - Fatal编程技术网

C 获取进行(非法)内存访问的函数名

C 获取进行(非法)内存访问的函数名,c,memory,signals,C,Memory,Signals,出于调试原因,我试图打印进行非法内存访问(例如超出范围)的函数的名称 我已经编写了一个SIGSEGV信号处理程序来打印指令指针(IP)和故障内存地址,但是我无法创建一个方法,以便能够获取函数名而不是IP 是否有方法修改信号处理程序的签名,以将函数作为参数传递,或者是否有其他方法 注意:该程序是用C编写的,我尝试在Linux环境中执行此操作。您可以使用backtrace和backtrace\u symbols\u fd打印带有调用堆栈的函数名 检查手册页中是否有backtrace和backtrac

出于调试原因,我试图打印进行非法内存访问(例如超出范围)的函数的名称

我已经编写了一个SIGSEGV信号处理程序来打印指令指针(IP)和故障内存地址,但是我无法创建一个方法,以便能够获取函数名而不是IP

是否有方法修改信号处理程序的签名,以将函数作为参数传递,或者是否有其他方法


注意:该程序是用C编写的,我尝试在Linux环境中执行此操作。

您可以使用
backtrace
backtrace\u symbols\u fd
打印带有调用堆栈的函数名

检查手册页中是否有
backtrace
backtrace\u符号
backtrace\u符号

例如:


这有什么用?对于未定义的行为,您甚至不能指望获得SEGFULT。在开发过程中使用调试器,可能是对核心转储进行后期调试。在运行时,尝试优雅的终止,就这样。而
\uuuu函数\uuuu
不是一个变量,而是一个预处理器宏。为什么不使用这样的调试工具呢?它可以帮助您处理与内存调试相关的所有事情。您需要获取线程的堆栈跟踪(回溯)。看看这个。这里有更多细节:@Olaf我试图捕获所有函数对定义良好的堆分配内存的每次内存访问。我认为函数是一个变量,因为gcc文档说明了这一点。()