我在C中使用vxworks平台 . 我无法在静态C函数上设置断点 . 事实上,当我在我的卡上加载代码时,我在函数名称上执行lkup时找不到它 .
如果我使用nm和grep在可执行文件中找到符号,它看起来就像函数的名称 . 我们正在将代码移植到我们的平台,该平台使用(正确)静态关键字用于大量函数,但是我无法在任何这些函数上设置断点 .
有没有人知道为什么我看不到lkup上的C静态函数以及如何查找它们并设置断点 .
谢谢,
抢
假设例程确实存在,就像你期望的那样(即,没有优化或内联) - 我在这种情况下使用了几种方法:
Assembly breakpoint
假设你想在静态函数 foo() 设置一个断点 . 找到调用 foo() 的代码 - 让我们说 bar() 调用 foo() . bar() 调用 foo() ,设置断点 .
foo()
bar()
运行直到你到达 bar() 调用 foo() 的断点 . 步骤在装配级别 . 这应该让你在 foo() 的第一条指令 . 请注意,如果有参数传递,您可能需要逐步执行一些指令 - 希望您知道在您的体系结构中分支/子例程调用是什么样的 .
当您在 foo() 的第一条指令处着陆时设置装配断点 .
Function pointer
我还通过使用 foo() 的地址初始化函数指针来解决这个问题 . 系统运行时,请读取调试器中的函数指针 . 获取 foo() 的地址 . 根据此地址设置断点 .
请注意,在这些情况下,您可能没有交错源 .
我认为不可能做你想做的事 . 编译器不需要为静态函数生成符号,甚至可以内联它们 .
例:
$ gcc -o test test.c $ nm test | grep foo 0000000000400524 t foo $ gcc -O2 -o test test.c $ nm test | grep foo $
从它的声音,你正在使用shell来进行调试和设置断点 .如果是这种情况,您可能会遇到问题,因为静态函数具有内部链接,并且不再是全局可见的函数(对于shell) .
如果您正在使用DKM并使用ld命令加载模块,则可以向LD添加一个参数,该参数还将包含您应该能够在shell中操作的静态符号 .
3 回答
假设例程确实存在,就像你期望的那样(即,没有优化或内联) - 我在这种情况下使用了几种方法:
Assembly breakpoint
假设你想在静态函数
foo()
设置一个断点 . 找到调用foo()
的代码 - 让我们说bar()
调用foo()
.bar()
调用foo()
,设置断点 .运行直到你到达
bar()
调用foo()
的断点 . 步骤在装配级别 . 这应该让你在foo()
的第一条指令 . 请注意,如果有参数传递,您可能需要逐步执行一些指令 - 希望您知道在您的体系结构中分支/子例程调用是什么样的 .当您在
foo()
的第一条指令处着陆时设置装配断点 .Function pointer
我还通过使用
foo()
的地址初始化函数指针来解决这个问题 . 系统运行时,请读取调试器中的函数指针 . 获取foo()
的地址 . 根据此地址设置断点 .请注意,在这些情况下,您可能没有交错源 .
我认为不可能做你想做的事 . 编译器不需要为静态函数生成符号,甚至可以内联它们 .
例:
从它的声音,你正在使用shell来进行调试和设置断点 .
如果是这种情况,您可能会遇到问题,因为静态函数具有内部链接,并且不再是全局可见的函数(对于shell) .
如果您正在使用DKM并使用ld命令加载模块,则可以向LD添加一个参数,该参数还将包含您应该能够在shell中操作的静态符号 .