我有一个C linux应用程序(A),它启动时产生另一个进程(P).当我想像往常一样调试PI start A并且我用ddd/gdb连接到P.
当我想调试P的入口点(主要的开始)时出现问题.如果我将调试器连接到P时遵循通常的方法已经很晚了.我发现的解决方案是在P的主要开头插入一个睡眠,所以我有时间与gdb连接,但这不是一个非常优雅的解决方案.
我也尝试过使用asm("int $3")它似乎不起作用.
你知道我怎么能解决这个问题吗?(最好不要改变A或P的代码)
我有Linux系统,我编写程序使用Clion IDE,使用CMake.我有一个部分我的程序,我想调试子进程 我从这个论坛阅读了一些主题,但我仍然不知道如何或在哪里,我可以打开这个功能:
fork之后的gdb调试子进程(跟随fork-mode子配置)
我只是尝试设置标志CMAKE_CXX_FLAGS_DEBUG ,set follow-fork-mode child但CMake给我错误.下面的屏幕截图包含用于编译和dbug我的程序的所有标志.那么我必须设置这个功能的地方和地点.
..::编辑::..
我相信这是好方法.我认为你的提示很有用,但我有下一个问题.使用您的说明后,我的代码就会崩溃
pid_t newProcessForClient = fork();
Run Code Online (Sandbox Code Playgroud)
声明是:
(gdb)设置follow-fork-mode子句[新进程31667]警告:文件"/lib32/libthread_db-1.0.so"自动加载已被``auto-load safe-path'设置为"$ debugdir: $ DATADIR /自动加载".警告:无法找到libthread_db匹配劣质的线程库,线程调试将无法使用.[切换到过程31667]继续信号SIGABRT.
程序终止,信号SIGABRT,Aborted.该计划已不复存在.
我正在使用gdb非常方便的多劣支持来调试进程树:
(gdb) set detach-on-fork off
(gdb) set schedule-multiple on
(gdb) set follow-fork-mode parent
(gdb) break PostgresMain
(gdb) break PostmasterMain
Run Code Online (Sandbox Code Playgroud)
现在需要让事情运行,直到我在一些尚未产生的劣势中遇到未来的断点之一。
但是,gdb每当低级正常退出时似乎“有帮助”暂停,或者至少阻止对低级的清理以便其父级wait()可以返回:
(gdb) c
[New process 16505]
process 16505 is executing new program: /home/craig/pg/bdr/bin/pg_config
Reading symbols from /home/craig/pg/bdr/bin/pg_config...done.
[Inferior 2 (process 16505) exited normally]
(gdb) info inferior
Num Description Executable
* 2 <null> /home/craig/pg/bdr/bin/pg_config
1 process 16501 /usr/bin/make
(gdb) inferior 1
[Switching to inferior 1 [process 16501] (/usr/bin/make)]
[Switching to thread 1 (process 16501)] …Run Code Online (Sandbox Code Playgroud)