精华内容
下载资源
问答
  • 使用 VS 2019 编写调试 Linux C/C++程序

    万次阅读 热门讨论 2019-04-05 17:59:24
    环境要求 、创建新项目 、配置连接器 、Linux安装远程调试编写调试Linux程序编写Linux多线程程序


    VS 2019安装 :https://blog.csdn.net/ZYZMZM_/article/details/89045810

    首先在安装时我们需要选择 “使用 C++ 的 Linux 开发


    环境要求

    • VS 2019
    • 安装了gcc、g++版本在4.8以上的Linux主机

    接下来讲解一下使用 VS2019 进行Linux程序的编写和调试。

    首先我们创建一个Linux控制台程序

    创建新项目


    开启VS2019后,点击“创建新项目”:

    选择语言 C++ :

    选择平台 Linux

    我们可以选择空项目或者是生成默认控制台hello程序,这里我们选择空项目:

    然后输入项目名称进行创建:

    配置连接器


    首次使用VS编写Linux程序时,我们需要配置连接器:点击 工具 - 选项

    点击 跨平台 - 连接管理器 - 添加

    然后我们输入 Linux 主机 ip、用户名、密码等信息进行连接:

    Linux安装远程调试


    注意:此时Linux主机必须安装远程调试的服务
    ubuntu下安装如下
    在这里插入图片描述
    安装完成后,即可连接成功。注意,只要linux主机开启SSH服务即可,只要XShell能通过22号端口连接到linux主机都可连接成功。

    编写并调试Linux程序

    右击项目,添加新建项 - 添加 C++ 源文件

    接下来我们编写一个普通程序并进行生成:

    接下来我们设置断点,即可开始调试程序,右侧为Linux的控制台窗口,即为程序输出:
    在这里插入图片描述

    编写Linux多线程程序

    接下来我们编写一个多线程程序,编写完成后发现编译错误:
    在这里插入图片描述
    我们在linux下编译此程序时都要加上 静态库 -lpthread,那么对于在linux下编译过程中如果需要用到的静态库的程序,在VS中我们就要在项目属性中:链接器->常规->附加库目录中添加对应的库路径(写Linux环境下的绝对路径),在链接器->输入->库依赖项里面写上需要的库名称,去掉名称里面的lib和扩展名.a。例如:libpthread.a就是pthread。

    接下来我们去Ubuntu下查找线程静态库所在位置:

    我们需要的是 libpthread.a 和 libpthread_nonshared.a 静态库,并且得到其绝对路径是

    /usr/lib/x86_64-linux-gnu/libpthread.a 
    /usr/lib/x86_64-linux-gnu/libpthread_nonshared.a
    

    注意,不同系统中的路径不一定相同

    接下来我们在项目中 右击 - 属性,在链接器->常规->附加库目录中添加对应的库路径(绝对路径):

    然后在链接器->输入->库依赖项里面写上需要的库名称:
    pthread 和 pthread_nonshared

    接下来我们重新生成解决方案,则可成功通过。

    接下来我们设置断点,即可开始调试程序,右侧为Linux的控制台窗口,即为程序输出:
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 用vs编写调试linux C++程序

    千次阅读 2017-04-20 20:36:55
    原文地址:阅读英文原文在Windows下用Visual Studio 2017 编写Linux C++ 程序1. 安装VS2017 下载Visual Studio Community ,它对于小型团队是免费的并且是开源的; 安装时勾选Linux development with C++; 2. ...

    在Windows下用Visual Studio 2017 编写Linux C++ 程序

    1. 安装VS2017
    下载Visual Studio Community ,它对于小型团队是免费的并且是开源的;
    安装时勾选Linux development with C++;
    这里写图片描述

    2. 配置目标Linux

    如果操作系统是Win10,那么可以安装WSL.
    (Windows Subsystem for Linux(简称WSL)是一个为在Windows 10上能够原生运行Linux二进制可执行文件(ELF格式)的兼容层。它是由微软与Canonical公司合作开发,目标是使纯正的Ubuntu 14.04 “Trusty Tahr”映像能下载和解压到用户的本地计算机,并且映像内的工具和实用工具能在此子系统上原生运行。– 百度百科)

    目标Linux机器上需要安装gdbserver ,openssh-server,build-essential

    (1)gdbserver用于远程调试;
    (2)SSH协议族可以进行远程控制,openssh是其开源实现;
    (3)build-essential软件包作用:提供编译程序必须软件包的列表信息,编译程序有了这个软件包,它才知道 头文件和使用的库函数在哪里。

    目标Linux可以是上面提到的WSL,也可以远程服务器,比如阿里云服务器。

    安装所需:

    $ sudo apt update
    $ sudo apt install -y build-essential
    $ sudo apt install -y gdbserver
    $ sudo apt install -y openssh-server
    

    安装好之后打开/etc/ssh/sshd_config

    sudo nano /etc/ssh/sshd_config

    将PasswordAuthentication之后改为yes,开启密码验证。

    然后生成ssh keys 并且开启服务

    $ sudo ssh-keygen -A
    $ sudo service ssh start

    3.配置

    1. 新建项目
      这里写图片描述
    2. 确定你的目标Linux
      这里写图片描述

    3. 配置目标Linux
      打开工具-选项-跨平台-连接管理器,点击添加
      这里写图片描述

    **如果是远程服务器,那么主机名输入ip地址,我这里用的是ubuntu云服务器,用户名为ubuntu;
    如果是本地WSL,主机名是localhost。**
    然后输入你的密码。

    在项目属性中确定远程计算机:
    这里写图片描述

    4 运行调试代码
    这里写图片描述
    这里其实是远程服务器上编译生成。

    没有报错,现在看我的远程服务器上多了个projects目录
    这里写图片描述

    但是没有生成可执行文件,有点奇怪。我只能自己g++。

    我的Linux特有的头文件是不全的,自己下载了一个Linux下的include,
    放在了G:\VS2017\Common7\IDE\VC\Linux\include\usr\include

    注意:在#include <> 提示输入时,Windows下是\,我们需要改成/,这样虽然vs提示报错,但是可以成功编译,因为是在远程Linux服务器上编程生成。

    这样就可以在vs中编写和调试Linux C++程序了:)

    参考:http://t.cn/RX2bxm2

    展开全文
  • 文章目录线程创建线程终止线程等待线程分离使用 gdb 调试多线程程序 本文的环境: Linux centos-7.shared 3.10.0-693.5.2.el7.x86_64 #1 SMP Fri Oct 20 20:32:50 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux gcc 版本...

    本文的环境:
    Linux centos-7.shared 3.10.0-693.5.2.el7.x86_64 #1 SMP Fri Oct 20 20:32:50 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
    gcc 版本 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)

    本文使用 POSIX 线程库,需引入头文件 pthread.h,在编译的时候要注意添加 -lpthread 参数。

    POSIX 是一个标准,约定一个操作系统应该提供哪些接口,pthread 即为 posix thread。C++11、Python、Java 均内置了线程库。

    线程创建

    int pthread_create(
    	pthread_t *thread, 
    	const pthread_attr_t *attr,
    	void *(*start_routine) (void *), 
    	void *arg
    );
    

    参数:
    thread 是一个输出型参数,返回一个线程 id。
    attr 可以设置线程属性,填 NULL 表示使用默认属性。
    start_routine 是一个函数指针,是线程执行的入口函数。
    arg 是 start_routine 的函数参数。
    值得注意的是这个函数 arg 是不支持传递多个参数的(可变参数),如果需要传递多个函数就需要使用 struct 或者一些别的方式。

    返回值:
    成功返回 0,失败返回错误码。

    栗子:
    创建一个线程,传递一个参数,并在这个新线程内打印这个参数。
    在这里插入图片描述

    #include <stdio.h>
    #include <unistd.h>
    #include <pthread.h>
    
    struct ThreadArg {
        int num;
    };
    
    void* ThreadEntry(void* arg) {
        while (1) {
            printf("In ThreadEntry, %lu, arg %d\n", pthread_self(), ((struct ThreadArg*) arg)->num);
            sleep(1);
        }
    }
    
    int main() {
        pthread_t tid;
        struct ThreadArg ta;
        ta.num = 20;
        pthread_create(&tid, NULL, ThreadEntry, &ta);
        while (1) {
            printf("In Main Thread, %lu\n", pthread_self());
            sleep(1);
        }
    
        return 0;
    }
    

    注意:
    上面代码中使用了 pthread_self() 获取线程的 id,这是 POSIX 线程库提供的库函数,操作系统也提供了一个获取线程 id 的系统调用 gettid()

    pthread_t pthread_self(void);
    pid_t gettid(void);
    

    但是当你在同一个线程调用两个函数的时候发现返回的并不是相同的值。

    The thread ID returned by this call is not the same thing as a POSIX thread ID.
    (i.e., the opaque value returned by pthread_self(3)).
    对于单线程的进程,内核中tid==pid,对于多线程进程,他们有相同的pid,不同的tid。tid用于描述内核真实的pid和tid信息。
    pthread_self返回的是posix定义的线程ID,man手册明确说明了和内核线程tid不同。它只是用来区分某个进程中不同的线程,当一个线程退出后,新创建的线程可以复用原来的id。

    gettid() 和 pthread_self()的区别

    线程终止

    想让一个线程结束而不终止进程:
    1、从线程处理函数 return
    2、线程自己调用 pthread_exit 切腹自尽。

    void pthread_exit(void *retval);
    

    参数:输入 & 输出型参数。
    注意:pthread_exit 参数所指向的内存单元必须是全局的或者是用malloc 分配的,不能在线程函数的栈上分配,因为当其它线程得到这个返回指针时线程函数已经退出了。

    3、兄弟线程调用 pthread_cancel 终止同一进程中的另一个线程。

    int pthread_cancel(pthread_t thread);
    

    参数:线程 id
    返回值:成功返回 0,失败返回错误码。
    注意:这个 pthread_cancel 是温和的终止一个线程而不是强制 kill 掉,抽象一个例子就是你在召唤师峡谷杀敌ing,你妈喊你吃饭,你可能得等一会才过去吃饭。

    线程等待

    为什么要线程等待?
    例如,计算一个很大的矩阵相乘,可以使用多线程方式来计算,每个线程计算其中的一部分,最终等待所有的线程执行完,主线程汇总结果,这里就用 pthread_join 来保证逻辑。

    int pthread_join(pthread_t thread, void **retval);
    

    参数:thread 线程 id,retval 指向一个指针,这个指针指向线程的返回值,不关注线程的返回值可以填 NULL。
    返回值:成功返回 0,失败返回错误码。
    调用该函数的线程将挂起等待,直到 id 为 thread 的线程终止。thread 线程以不同的方法终止,通过 pthread_join 得到 的终止状态是不同的:
    1、如果thread线程通过 return 返回, value_ ptr 所指向的单元里存放的是thread线程函数的返回值。
    2、如果thread线程被别的线程调用 pthread_cancel 异常终掉, value_ ptr 所指向的单元里存放的是常数 PTHREAD_CANCELED。
    3、如果thread线程是自己调用 pthread_exit 终止的,value_ptr 所指向的单元存放的是传给 pthread_exit 的参数。

    线程分离

    类似于忽略 SIGCHLD 信号,分离后就代表线程的死活不管了,也就不用 pthread_join 回收了。

    int pthread_detach(pthread_t thread);
    

    可以自己把自己分离出去,也可以被兄弟线程分离。
    pthread_detach(pthread_self());

    使用 gdb 调试多线程程序

    0、使用 gdb 调试多线程程序

    使用 gdb 调试一个程序需要在编译时候加上 -g 选项,为什么?百度去。

    gdb attach 28966
    
    info thread # 查看所有线程信息
    bt # 查看当前线程调用栈
    thread 2 # 切换当前线程
    

    在这里插入图片描述

    1、查看一个程序的所有线程信息

    ps -eLf | grep a.out
    

    参数:-L 表示 LWP,这里 ps 得到的线程 id 是和 gettid 一样的。
    在这里插入图片描述

    2、查看一个程序依赖哪些库

    ldd a.out
    

    在这里插入图片描述
    3、查看一个进程中有几个线程和线程调用栈

    pstack 27779
    

    在这里插入图片描述


    EOF

    展开全文
  • linux程序调试

    千次阅读 2013-08-21 00:29:46
    转自编程吧。。。 调试-linux程序设计 ...程序调试的5个阶段 使用printf来排错  相信这个方法是N多人使用的方法 使用-Wall选项来排错  在使用gcc编译的时候加上-Wall选项,可以提前发现很多的

    转自编程吧。。。

    调试-linux程序设计

    clip_image001

    错误查找及纠正

    有几种原因会造成程序的缺陷,针对每种原因,都有一些建议的方法来查找和纠正。比如功能定义错误,设计规划错误和代码编写错误

    clip_image003

    程序调试的5个阶段

    clip_image005

    使用printf来排错

           相信这个方法是N多人使用的方法

    使用-Wall选项来排错

           在使用gcc编译的时候加上-Wall选项,可以提前发现很多的warnings

    注释法

           将怀疑有错的程序块注释起来,查看一下结果,如此反复即可。

    使用内置宏__FILE__

           灵活使用内置宏__LINE__,__FILE__,__DATE____TIME可以很快速地定位问题所在。

    使用assert断言来预防错误的发生

           诸如分母不能为0的情况。

    专业级别的gdb调试

           关于gdb的调试,参考:

    clip_image006 clip_image008 clip_image010

    静态分析调试工具

    ctags

           参考:http://ctags.sourceforge.net/

           相信使用过vim的童鞋都晓得这个工具,ctagsGenerate tag files for source code)是vim下方便代码阅读的工具。尽管ctags也可以支持其它编辑器,但是它正式支持的只有VIM。并且VIM中已经默认安装了Ctags,它可以帮助程序员很容易地浏览源代码。

    ctags 最先是用来生成C代码的tags文件,后来扩展成可以生成各类语言的tags,有些语言也有专有的tags生成工具(比如javajtags, python ptags)

    clip_image012

    cxref

    参考:http://www.gedanken.demon.co.uk/cxref/

    Cxref是一款在LaTeXHTMLRTFSGML中将C代码生成文件的程序,包括从C程序源代码的交叉引用。它用于ANSI C,包含大多数gcc扩展,可以从代码中的注释进行生成适当格式的程序文档,交叉引用来自于代码本身并不需要额外的工作。

    clip_image014

    cflow

    参考:http://www.gnu.org/software/cflow/

    GNU cflow analyzes a collection of C source files and prints a graph, charting control flow within the program.

    GNU cflow is able to produce both direct and inverted flowgraphs for C sources. Optionally a cross-reference listing can be generated. Two output formats are implemented: POSIX and GNU (extended).

    Input files can optionally be preprocessed before analyzing.

    The package also provides Emacs major mode for examining the produced flowcharts in Emacs.

    clip_image016

    动态分析调试工具

    gprof

    gprofGNU profiler工具。可以显示程序运行的“flat profile”,包括每个函数的调用次数,每个函数消耗的处理器时间。也可以显示调用图,包括函数的调用关系,每个函数调用花费了多少时间。还可以显示注释的源代码,是程序源代码的一个复本,标记有程序中每行代码的执行次数。

    gprof编译程序


    在编译或链接源程序的时候在编译器的命令行参数中加入“-pg”选项,编译时编译器会自动在目标代码中插入用于性能测试的代码片断,这些代码在程序在运行时采集并记录函数的调用关系和调用次数,以及采集并记录函数自身执行时间和子函数的调用时间,程序运行结束后,会在程序退出的路径下生成一个gmon.out文件。这个文件就是记录并保存下来的监控数据。可以通过命令行方式的gprof或图形化的Kprof来解读这些数据并对程序的性能进行分析。另外,如果想查看库函数的profiling,需要在编译是再加入“-lc_p”编译参数代替“-lc”编译参数,这样程序会链接libc_p.a库,才可以产生库函数的profiling信息。如果想执行一行一行的profiling,还需要加入“-g”编译参数。
    例如如下命令行:gcc -Wall -g -pg -lc_p example.c -o example

    clip_image018

    工具lint

    lint是最著名的C语言工具之一,是由贝尔实验室SteveJohnson1979PCC(PortableC Compiler)基础上开发的静态代码分析,一般由UNIX系统提供。与大多数C语言编译器相比,lint可以对程序进行更加广泛的错误分析,是一种更加严密的编译工具。最初,lint这个工具用来扫描C源文件并对源程序中不可移植的代码提出警告。但是现在大多数lint实用程序已经变得更加严密,它不但可以检查出可移植性问题,而且可以检查出那些虽然可移植并且完全合乎语法但却很可能是错误的特性。

    随着历史的推移,Lint后来形成了一系列的工具,包括PC-Lint/FlexeLint(Gimpel),LintPlus(Cleanscape)以及Splint

    clip_image019

    内存调试工具ElectricFence

    clip_image020

    参考:http://directory.fsf.org/wiki/Electric_Fence

           实际运行环境中经常比较困扰的问题是内存产生轻微越界,但是并没有立刻产生问题, 给调查带来很大难度。

    如果程序问题调查没有头绪,可以借助 Electric Fence (简称 Efence )工具检查内存问题并产生 CORE 文件,比较精确的定位问题场所。

           在发生如下问题的情况下此工具会转储 CORE

     1 )动态分配内存边界外的读写操作

     2 )访问已经 free 的内存

     3  free 的地址不是 malloc() 分配的

    Valgrind

           参考:http://valgrind.org/

    Valgrind是一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具。

    clip_image021

    展开全文
  • windows的C/C++程序员转到linux下面,面对的是不怎么友好的IDE及调试环境,非常的苦恼,本文说明了常见的调试方法,最后介绍了使用vs+visualgdb的方法在windows下方便的调试linux程序,使windows程序转向linux程序...
  • 文章目录安装Redhat8使用VS2019编写调试Linux程序 去官网下载ISO镜像文件,大概在7G左右: 安装Redhat8 1、创建新的虚拟机: 2、下一步,默认即可 3、稍后安装OS 先建立虚拟机,之后再手动引导安装系统。...
  • 首先我们在调试时需要将 被调试程序 进行编译,编译时要加上-g选项这样相当于debug版本更好调试.(关于优化在程序后加上-O0这是没有优化,加上-O1这是一级优化,加上-O2这是二级优化等等) 接着我们把敲指令 :gdb 加上...
  • Linux bash程序调试讲解

    千次阅读 2013-11-29 08:34:35
    Linux bash程序的调试讲解  Linux bash程序在程序员的使用中十分重要,尤其是和shell程序的使用中...在编程过程中难免会出错,有的时候,调试程序比编写程序花费的时间还要多,shell程序同样如此。 shell程序的
  • Linux下环境配置 Ubuntu16.04下安装环境和SSH g++用来编译,gdb gdbserver用来调试,openssh-server负责远程登陆 sudo apt-get install openssh-server g++ gdb gdbserver 修改ssh登录的配置,即/etc/ssh/sshd_...
  • Linux程序调试利器-gdb

    2019-06-26 17:00:42
    一. gdb简介 编写一个优秀的代码离不开程序的调试,在 Windows 下有很多的集成开发环境内置了调试...gdb 是 GNU 发布的一款功能强大的程序调试工具,可以帮助程序员调试程序。 二. gdb的使用 1. 准备工作 ...
  • Linux下C语言程序简单的编写调试

    千次阅读 2011-07-26 22:50:53
    1.建一个目录2.写代码,建一个hello.c文件代码:view plaincopy to clipboardprint?#include "stdio.h" main() { printf("Hello Linux.\n") } view plaincopy to
  • 转自:http://biancheng.dnbcw.info/linux/257411.html 【1】 如何编译X86下的 uBuntu APP---非常简单: gcc -o testusb testusb.c 编译完成后即可生成 testusb ,这就是可执行文件。 【2】下面制...
  • 来自: ...1 准备一台Linux机器用来编译程序,我用的是虚拟机安装的CentOS网络设置成桥接模式  (1)安装并开启SSH  (2)安装 gcc g++ gdb  (3)关闭防火墙或者开启允许SSH对外访问的网络
  • I've blogged about the "Windows Subsystem for Linux" (also known as "Bash on Ubuntu on Windows") many times before. Response to this Windows feature has been a little funny because folks try to: 我...
  • 原标题:连载 | 系统学习Linux+Android:bootloader编译等常见驱动程序编写调试学习(三)导语昨天给大家讲了嵌入式开发前需要准备的知识:基本C语言编程、PC linux命令行操作,硬件知识,再从windows系统单片机开发...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,598
精华内容 639
关键字:

linux编写程序调试

linux 订阅