有没有办法在每次调用某个函数时在C或C++中正在运行的进程中转储调用堆栈?我的想法是这样的:
void foo()
{
print_stack_trace();
// foo's body
return
}
Run Code Online (Sandbox Code Playgroud)
其中的print_stack_trace
工作方式类似于caller
Perl.
或类似的东西:
int main (void)
{
// will print out debug info every time foo() is called
register_stack_trace_function(foo);
// etc...
}
Run Code Online (Sandbox Code Playgroud)
在哪里register_stack_trace_function
放置某种内部断点,这将导致在调用时打印堆栈跟踪foo
.
在某些标准C库中是否存在这样的事情?
我正在使用GCC在Linux上工作.
我有一个测试运行,基于一些不应该影响此行为的命令行开关,行为不同.我的代码有一个伪随机数生成器,我假设它是基于这些开关被不同地调用的.我希望能够使用每组开关运行测试,并查看随机数生成器是否针对每个开关进行不同的调用.
我有一个指向函数的指针,假设有任何签名.我有5个不同的功能和相同的签名.
在运行时,其中一个被分配给指针,并调用该函数.
如果不在这些函数中插入任何print语句,我怎样才能知道指针当前指向的函数名称?
我想显示我正在调用的函数的名称.这是我的代码
void (*tabFtPtr [nbExo])(); // Array of function pointers
int i;
for (i = 0; i < nbExo; ++i)
{
printf ("%d - %s", i, __function__);
}
Run Code Online (Sandbox Code Playgroud)
我用它__function__
作为一个例子,因为它与我想要的非常接近,但我想显示指向的函数的名称tabFtPtr [nbExo]
.
谢谢你帮助我:)
在C++中,有没有办法从它的指针中获取函数签名/名称?
void test(float data) {}
cout << typeid(&test).name();
Run Code Online (Sandbox Code Playgroud)
我想使用这些数据进行日志记录.
我想建立一个服务器,学生可以上传和运行课程代码.但是,我不希望它们访问各种功能,例如system(),这可能会导致对我的服务器的错误访问.我可以在预处理器输出中搜索显式函数调用,但是如果用户创建一个这样的函数指针:
int (*syst)(const char*) = system;
syst("rm *");
Run Code Online (Sandbox Code Playgroud)
我仍然对这种威胁持开放态度.但是,我不能只搜索字符串"system",例如,因为它是一个有效的名称 - 如果学生不包含cstdlib,他们可以使用该名称作为变量名.由于这是一个开始的编程课程,拥有十英里长的变量名称黑名单是一个坏主意.
有没有办法定义除名称以外的功能,并允许我在编译代码之前搜索其他名称?
我现在有一系列具有相同功能的函数,
func_pointer_t func_array[] = {func_1, func_2, func_3, ...};
Run Code Online (Sandbox Code Playgroud)
我想开发一个遍历所有数组成员的程序,并将输出转储到另一个.dat数据文件.输出应具有以下格式:
func_1 func_1_output
func_2 func_2_output
func_3 func_3_output
...
Run Code Online (Sandbox Code Playgroud)
所以我的问题是 - 当遍历数组成员时,我们怎么能让程序知道函数指针指向哪个函数名(例如func_array [0]指向func_1)?