C++ 如何使用命令行参数附加到进程?

C++ 如何使用命令行参数附加到进程?,c++,linux,gdb,C++,Linux,Gdb,我启动了一个Centos进程,该进程已经运行了几个小时。我使用gcc-g来构建共享库和可执行文件。我通过输入gdb./matchupaccurial启动了gdb流程。一旦gdb启动,我输入run-input XXXXXXX-fileloc yyyyyy-version 5 当我输入ps-ef时,我看到两个进程id号,一个用于gdb./MatchUpAccurate.exe,另一个用于./MatchUpAccurate.exe-input XXXXXXX-fileloc YYYYY-version

我启动了一个Centos进程,该进程已经运行了几个小时。我使用gcc-g来构建共享库和可执行文件。我通过输入gdb./matchupaccurial启动了gdb流程。一旦gdb启动,我输入run-input XXXXXXX-fileloc yyyyyy-version 5

当我输入ps-ef时,我看到两个进程id号,一个用于gdb./MatchUpAccurate.exe,另一个用于./MatchUpAccurate.exe-input XXXXXXX-fileloc YYYYY-version 5

由于子进程已经运行了几个小时,我想附加到它,这样我就可以检查它的变量值,并查看它当前正在运行的指令


我阅读了一些文档以及如何使用gdb连接已经运行的进程。但是,所有示例都没有命令行参数。我想知道如何使用gdb附加带有命令行参数的进程。我希望能够设置断点、检查变量、查看调用堆栈,并在不终止原始进程的情况下逐步遍历执行路径。多谢各位

您需要连接到pid:

gdb二进制名称pid

或者,启动gdb并连接

user@host ~> gdb binary_name
(gdb) attach 1234

您需要附加到pid:

gdb二进制名称pid

或者,启动gdb并连接

user@host ~> gdb binary_name
(gdb) attach 1234

如果使用gdb启动exe,则不必附加到它。只需按Ctrl-C并查看变量

如果要附加,请启动exe:

./myexe --myopt myargs
获取pid:

myexe_pid=$!
然后附上:

gdb ./myexe $myexe_pid

my2c

如果使用gdb启动exe,则不必附加到它。只需按Ctrl-C并查看变量

如果要附加,请启动exe:

./myexe --myopt myargs
获取pid:

myexe_pid=$!
然后附上:

gdb ./myexe $myexe_pid

my2c

我尝试了这个,但当我进入continue时,gdb响应程序未运行。当我输入bt时,gdb没有堆栈响应。当我输入info参数时,gdb响应时没有选择任何帧。当我进入run时,gdb请求命令行参数。当我运行-input xxx-fileloc yyyyy-version 5时,gdb从程序的开头开始运行。谢谢。@Frank:您是否使用与待调试进程相同的用户/权限运行gdb?@jweyrich,是的,我使用与待调试进程相同的用户/权限运行gdb。我应该这么做吗?谢谢。@Frank:是的,这是正确的方法,应该有效。无论如何,如果目标应用程序是可信的,请尝试以root用户身份运行gdb,以防万一,但我怀疑这会有什么区别。如果这也不起作用,我会冒险说你传递了一个无效的PID,或者有什么东西在保护进程不被调试。Sams应该起作用,但如果出于某种原因它不起作用,另一种策略是向子进程发送一个生成核心的信号,比如sibabrt。然后可以将核心文件加载到调试器中。请注意,您需要确保核心已启用。ulimit-cI尝试了这个方法,但当我输入continue时,gdb响应程序没有运行。当我输入bt时,gdb没有堆栈响应。当我输入info参数时,gdb响应时没有选择任何帧。当我进入run时,gdb请求命令行参数。当我运行-input xxx-fileloc yyyyy-version 5时,gdb从程序的开头开始运行。谢谢。@Frank:您是否使用与待调试进程相同的用户/权限运行gdb?@jweyrich,是的,我使用与待调试进程相同的用户/权限运行gdb。我应该这么做吗?谢谢。@Frank:是的,这是正确的方法,应该有效。无论如何,如果目标应用程序是可信的,请尝试以root用户身份运行gdb,以防万一,但我怀疑这会有什么区别。如果这也不起作用,我会冒险说你传递了一个无效的PID,或者有什么东西在保护进程不被调试。Sams应该起作用,但如果出于某种原因它不起作用,另一种策略是向子进程发送一个生成核心的信号,比如sibabrt。然后可以将核心文件加载到调试器中。请注意,您需要确保核心已启用。ulimit-cneuro,我试过你的建议。但是,我在启动我的exe时。它在执行路径的最开始处启动另一个进程。在我的例子中,新的proram进入睡眠状态,因为它遇到了sqlite数据库锁。我真的希望能够附加到原来已经运行的进程,并在运行3个多小时后拦截程序状态。谢谢。然后使用ps查找要附加到的进程的进程id,并将gdb与启用调试的可执行文件和pid@Chris,谢谢你的建议。我已经试过了,效果很好。我解决了我原来的问题。我最初使用gdb./MatchUpAccurate.exe启动gdb进程。当我尝试附加到gdb进程或MatchUpAccurate.exe子进程时,我找不到有关该子进程的任何信息。相反,我在没有gdb的情况下启动了MatchUpAccurate.exe进程,现在我可以连接它并找到所有的网元
不必要的信息。谢谢你的帮助@弗兰克:很高兴你用gdb解决了你的问题。。。祝你的exe问题好运;neuro,我试过你的建议。但是,我在启动我的exe时。它在执行路径的最开始处启动另一个进程。在我的例子中,新的proram进入睡眠状态,因为它遇到了sqlite数据库锁。我真的希望能够附加到原来已经运行的进程,并在运行3个多小时后拦截程序状态。谢谢。然后使用ps查找要附加到的进程的进程id,并将gdb与启用调试的可执行文件和pid@Chris,谢谢你的建议。我已经试过了,效果很好。我解决了我原来的问题。我最初使用gdb./MatchUpAccurate.exe启动gdb进程。当我尝试附加到gdb进程或MatchUpAccurate.exe子进程时,我找不到有关该子进程的任何信息。相反,我在没有gdb的情况下启动了MatchUpAccurate.exe进程,现在我可以附加它并找到所有必要的信息。谢谢你的帮助@弗兰克:很高兴你用gdb解决了你的问题。。。祝你的exe问题好运;