首页 > 系统相关 > Linux 多进程程序调试实例(二)

Linux 多进程程序调试实例(二)

时间:2023-01-17 17:25:50浏览次数:39  
标签:const exec int 程序调试 char 实例 Linux main multiexec

进阶版多进程程序实例

主要是使用子进程去执行调用另外一个可执行程序,具体实现是调用 exec 函数簇实现一个进程对执行另外一个可执行程序的功能。

  1. exec 函数簇定义
#include <unistd.h>

extern char **environ;

int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg,..., char * const envp[]);
int execv(const char *path, char *constargv[]);
int execvp(const char *file, char *constargv[]);
int execvpe(const char *file, char *const argv[],char *const envp[]);
  1. 代码
// multiprocess.cpp
#include<iostream>
#include<unistd.h>
#include<cstdio>
int main()
{
    pid_t pid = fork();
    if( 0 == pid ) {
        std::cout << "hi, I'am a child process and the process id is " << getpid() << std::endl;
        execl("./multiexec","multiexec","arg1","arg2",NULL);
    }
    else if(pid > 0){
        std::cout << "hi, I'am a parent process and the process id is " << getpid() << std::endl;
    }
    else{
        perror("fork");
    }
    return 0;
}
// multiexec.cpp
#include<iostream>
#include<cstdio>

int main(int argc, char* argv[]){
    std::cout << __FILE__ << " " << __func__ << " " << __LINE__ << std::endl;

    if(argc > 1) {
        for(int i = 0; i < argc; ++i){
            printf("argv[%d]: %s\n", i, argv[i]);
        }
    }
    return 0;
}
  1. 调试
    因为当前我们知道要调试子进程,所以可以在刚进入GDB页面时就开始设置对应的调试属性
    1. GDB multiprocess
    2. set follow-fork-mode child
    3. catch exec // 捕获 exec 函数调用
    4. r // 执行后会直接运行到exec调用处,即子进程的执行函数处
    5. b main // 此时子进程的所有参数已经被替换成 multiexec 的对应的执行内容了
    6. c // 执行 c 而不是 s/n 的原因是,在exec调用到 main 函数中会有一些不知道什么的代码还在执行,会有好几步需要执行,索性就在 multiexec 的 main 处打上断点,然后直接执行到 main 函数处
  2. 调试记录
(gdb) set follow-fork-mode child
(gdb) catch exec 
Catchpoint 1 (exec)
(gdb) r
Starting program: /home/user/Desktop/code/ProgramDebug/multiprocess/multiprocess 
hi, I'am a parent process and the process id is 7621
[New process 7625]
hi, I'am a child process and the process id is 7625
process 7625 is executing new program: /home/user/Desktop/code/ProgramDebug/multiprocess/multiexec
[Switching to process 7625]

Thread 2.1 "multiexec" hit Catchpoint 1 (exec'd /home/user/Desktop/code/ProgramDebug/multiprocess/multiexec), 0x00007ffff7dd7c30 in _start () from /lib64/ld-linux-x86-64.so.2
(gdb) b main
Breakpoint 2 at 0x4008e5: file multiexec.cpp, line 6.
(gdb) c
Continuing.

Thread 2.1 "multiexec" hit Breakpoint 2, main (argc=2, argv=0x7fffffffee28) at multiexec.cpp:6
warning: Source file is more recent than executable.
6
(gdb) n
multiexec.cpp main 6
8               for(int i = 0; i < argc; ++i){
(gdb) 
9                   printf("argv[%d]: %s\n", i, argv[i]);

标签:const,exec,int,程序调试,char,实例,Linux,main,multiexec
From: https://www.cnblogs.com/wanghao-boke/p/17058198.html

相关文章

  • 国产服务器鲲鹏920安装Linux系统
    踩过的坑以及解决方案本次是在鲲鹏920服务器上安装Linux系统,由于初次在这种型号的服务器上安装系统,因此安装过程中我们踩了很多的坑。下面将记录我们踩过的坑以及解决方案......
  • Linux环境中动态库文件(.so文件)的realname,soname和linkname
     realname:实际等同于库文件的filename,是在库文件生成时就被指定的,如:gcc-shared-o$(realname)dependenceflagsrealname的一般格式为lib$(name).so.$(major).$(......
  • Linux动态库soname的使用
    通过一个简单的例子,体验一下Linux动态库soname的使用。假设有一个动态库:libbar.so.1.1.0,其对应的三个名称如下。realname:libbar.so.1.1.0soname:libbar.so.1linkname:l......
  • Linux执行SQLSERVER语句的简单方法
    背景因为WTF的原因.经常有人让执行各种乱七八槽的删除语句因为产品支持了10多种数据库.这个工作量非常复杂.为了简单起见,想着能够批量执行部分SQL.其他的都处理过了......
  • Linux动态链接库.so文件的命名及用途总结
    我们在linux下开发项目,有时会对外提供动态库,像***.so.1.0.0这样子的文件,另外提供相应的头文件。用户拿到动态库和头文件说明,就可以使用动态库里的function。那随之而来......
  • linux添加dns配置
    named.conf是DNS服务器bind的配置文件resolv.conf是系统的DNS配置系统的DNS配置1、编辑DNS配置文件vim/etc/resolv.conf没有resolv.conf文件,touch创建一个2......
  • Linux应用程序启动过程的静态分析
    这是一篇分析Linux应用程序启动过程的文章,从ELF的基本格式,段和节如何组成一个ELF可执行文件,到应用程序的加载和启动运行的流程做了一个完整的介绍,最后也稍稍涉及到安全性相......
  • openkylin (linux内核)微信(wechat)安装介绍
    1.Openkylin介绍Openkylin是麒麟软件公司主导的开源操作系统,正在逐步与该公司的银河麒麟操作系统保持基础库的同源。时至2022年12月,开源操作系统Openkylin的默认软件商......
  • Linux部署Java项目【reggie_take_out】
    方式1:手工命令https://www.bilibili.com/video/BV13a411q753/?p=139方式2:shell脚本自动https://www.bilibili.com/video/BV13a411q753/?p=140https://www.bilibili.com......
  • 小满Linux(第十章Nginx-Go-Access-日志分析器)
    将我们的Linux服务器设置为中文版$localectlset-localeLANG=zh_CN.UTF8重启服务器即可GoAccess是一款开源、实时,运行在命令行终端下的web日志分析工具。该工具提供快速......