如何在C静态函数上设置VxWorks断点?

时间:2012-01-06 14:57:23

标签: c static vxworks breakpoints

我在C中使用vxworks平台。我无法在静态C函数上设置断点。事实上,当我在我的卡上加载代码时,我在函数名称上执行lkup时找不到它。

如果我使用nm和grep在可执行文件中找到符号,它看起来就像函数的名称。我们正在将代码移植到我们的平台,该平台使用(正确)静态关键字用于大量函数,但是我无法在任何这些函数上设置断点。

有没有人知道为什么我看不到lkup上的C静态函数以及如何查找它们并设置断点。

谢谢,

罗布

3 个答案:

答案 0 :(得分:1)

假设例程确实存在,就像你期望的那样(即,没有优化或内联) - 我在这种情况下使用了几种方法:

程序集断点

  • 假设您要在静态函数foo()处设置断点。查找调用foo()的代码 - 假设bar()调用foo()。如果bar()调用foo(),请设置断点。

  • 一直运行,直到您点击bar()调用foo()的断点。步骤在装配级别。这应该让你在foo()的第一条指令。请注意,如果有参数传递,您可能需要逐步完成一些指令 - 希望您知道在您的架构中调用分支/子例程的内容。

  • foo()的第一条指令着陆时设置装配断点。

功能指针

我还通过使用foo()的地址初始化函数指针来解决这个问题。系统运行时,请读取调试器中的函数指针。获取foo()的地址。根据此地址设置断点。

请注意,在这些情况下,您可能没有交错源。

答案 1 :(得分:0)

我认为不可能做你想做的事。编译器不需要为静态函数生成符号,甚至可以内联它们。

示例:

$ gcc -o test test.c
$ nm test | grep foo
0000000000400524 t foo
$ gcc -O2 -o test test.c
$ nm test | grep foo
$

答案 2 :(得分:0)

从它的声音来看,你正在使用shell来进行调试和设置断点 如果是这种情况,您可能会遇到问题,因为静态函数具有内部链接,并且不再是全局可见的函数(对于shell)。

如果您正在使用DKM并使用ld命令加载模块,则可以向LD添加一个参数,该参数还将包含您应该能够在shell中操作的静态符号。