我用-g选项编译了我的freebsd libc源代码,现在我可以介入libc函数了。
但我无法进入系统调用代码。我用-g编译了freebsd内核源代码。在设置断点时,gdb会在.S文件上通知断点。在点击断点时,gdb无法进入系统调用源代码。
另外,我试过:gdb $ catch syscall open
但这也行不通。
你能建议吗?
感谢。
答案 0 :(得分:7)
您似乎对UNIX系统的工作方式缺乏了解。
想一想。假设你能够进入实现系统调用的内核函数,比如sys_open
。所以现在你在调试器中查看sys_open
的内核源代码。问题是:内核是在那个点运行,还是停止了。由于您希望在调试器中执行next
之类的操作,因此我们假设内核 已停止。
现在你按下n
键,会发生什么?
通常,内核会对键盘引发的中断做出反应,找出按下了哪个键,然后将该键发送到正确的进程({{1}中被阻止的进程来自控制键盘的终端。)
但你的内核已停止,所以没有按键给你。
结论:通过在同一台机器上运行的调试器来调试内核是不可能的。
事实上,当人们调试内核时,他们通常是通过在另一台机器上运行调试器来实现的(这称为远程调试)。
如果您真的想要进入内核,最简单的方法就是使用UML。
在您使用UML并了解用户空间/内核界面如何工作和交互之后,您可以尝试read(2)
,尽管设置通常有点复杂。您实际上不必为此拥有单独的计算机,您可以使用VMWare或VirtualPC或VirtualBox。
答案 1 :(得分:3)