相关疑难解决方法(0)

我如何在gdb中的"打印到终端上的东西"中加上断点?

我想知道在一个巨大的应用程序里面打印某个消息.应用程序是如此庞大和陈旧,它使用所有可能的方式将文本打印到终端; 例如printf(),fprintf(stdout,...)等.

我写了在write()系统调用上设置了一个断点,但是由于使用write()的各种文件I/O操作,我遇到了太多的断点停止.

所以基本上我希望gdb在程序向终端输出内容时停止,但同时我不希望gdb在程序向文件写入内容时停止.

printf gdb breakpoints conditional-breakpoint

25
推荐指数
2
解决办法
9088
查看次数

如何在GDB中为open(2)syscall返回-1设置断点

操作系统:GNU/Linux发行版
:OpenSuSe 13.1
Arch:x86-64
GDB版本:7.6.50.20130731-cvs
程序语言:主要是带有少量汇编的C语言

想象一下,我有一个相当大的程序,有时无法打开文件.是否可以在GDB中设置断点,使其在open(2)syscall返回-1 后停止?

当然,我可以通过源代码查找并查找所有open(2)调用并缩小错误open()调用,但也许有更好的方法.

我试图用"catch syscall open"然后"condition N if $rax==-1"但显然它并没有被击中.
顺便说一句,是否可以区分对系统调用(例如open(2))的调用和从open(2)GDB中的系统调用(例如)返回?

作为当前的解决方法,我执行以下操作:

  1. 在GDB下运行有问题的程序
  2. 从另一个终端启动systemtap脚本:

    stap -g -v -e 'probe process("PATH to the program run under GDB").syscall.return { if( $syscall == 2 && $return <0) raise(%{ SIGSTOP %}) }'
    
    Run Code Online (Sandbox Code Playgroud)
  3. 之后open(2)返回-1我收到SIGSTOP在GDB会话,我可以调试问题.

TIA.

最好的问候,
亚历克斯.

UPD:即使我之前尝试过nm建议的方法并且无法使其工作,我还是决定再试一次.2小时后,它现在按预期工作.但有一些奇怪的解决方法:

  1. 我仍然无法区分调用和从syscall返回
  2. 如果我使用finishin comm我无法使用continue,根据GDB文档即可,
    即以下内容确实会在每次中断时降至gdb提示符:

    gdb> comm
    gdb> finish …
    Run Code Online (Sandbox Code Playgroud)

c gdb systemtap

20
推荐指数
2
解决办法
6694
查看次数

write()和printf()之间的区别

最近我正在研究操作系统.我只想知道:

系统调用(如write())和标准库函数(如printf())之间有什么区别?

unix io operating-system system-calls

13
推荐指数
1
解决办法
2万
查看次数