首页 文章

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

提问于
浏览
1

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

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

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

谢谢,

3 回答

  • 0

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

    Assembly breakpoint

    • 假设你想在静态函数 foo() 设置一个断点 . 找到调用 foo() 的代码 - 让我们说 bar() 调用 foo() . bar() 调用 foo() ,设置断点 .

    • 运行直到你到达 bar() 调用 foo() 的断点 . 步骤在装配级别 . 这应该让你在 foo() 的第一条指令 . 请注意,如果有参数传递,您可能需要逐步执行一些指令 - 希望您知道在您的体系结构中分支/子例程调用是什么样的 .

    • 当您在 foo() 的第一条指令处着陆时设置装配断点 .

    Function pointer

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

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

  • 0

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

    例:

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

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

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

相关问题