c - 在 SystemVerilog+C DPI 调用的情况下如何堆叠跟踪信息?

标签 c stack-trace system-verilog system-verilog-dpi

我的情况是我有 2 个 C 函数。这些 C 函数有许多错误检查场景,我使用 exit(1) 来解决这些问题。系统 verilog 代码中的一百万处通过 DPI 调用调用这 2 个 C 函数。

我在我的 C 例程中使用了 execinfo.h 和 backtrace() 函数,但堆栈跟踪 info 显示 C 函数,但在其上方它仅显示一些随机的 vcs_exe.sim.1234_1.so 作为主要调用函数。

我什至尝试在已发布的区域中寻找这个 vcs_exe.sim.1234.so,但它没有指向任何已知的 Sv 文件。

那么,如何在显示堆栈跟踪时获取调用方非 C/SV 函数?

最佳答案

理想情况下,您的模拟器会有一个指南,向您展示如何执行此操作。这可能涉及更改构建脚本中的内容以允许额外的可见性。如果您在手册中找不到任何相关信息,供应商的支持部门应该能够帮助您。

如果您的工具不允许这样做,您可以尝试自己实现一些东西。如果您的 DPI 方法是 context,您可以使用 svScope 概念来计算调用者信息。我还没有测试过,但它应该是这样的:

svScope scope;
scope = svGetScope();

char *fileName, *lineNumber;
scope.svGetCallerInfo(fileName, lineNumber);

这假定 svGetCallerInfo(...) 返回 true,我猜它应该用于 context DPI 方法。

关于c - 在 SystemVerilog+C DPI 调用的情况下如何堆叠跟踪信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45537152/

相关文章:

system-verilog - 为什么 $urandom 即使使用种子(int 或任何其他)作为变量也给出相同的值?

c - 来自套接字的 "reading zero bytes"是监视 POSIX C 中 TCP/IP 断开连接的有效方法吗?

c - 下标值既不是数组也不是指针也不是c中的 vector

iphone - 堆栈跟踪错误聚合软件

c - 如何读取 ebpf 中的堆栈跟踪内核端?

Java 调用堆栈检查和操作

system-verilog - 在 UVC 中处理协议(protocol)扩展

inheritance - 为什么在 systemverilog 中继承常量变量不起作用

c - 待办事项列表,C 语言重新分配

c - 如何更新结构体中的字段?