How to use intellisense to parse dealii code using visual studio remotely?

330 views
Skip to first unread message

程迪

unread,
Aug 8, 2018, 1:09:58 AM8/8/18
to deal.II User Group
Hi, everyone.

I am trying to use visual studio 2017 linux dev workloads to compile and debug tutorial step1 remotely on docker container. I want to use intellisense of vs to help me. But I cannot figure out how.

Here is my steps:


2. I installed docker engine on windows using virtualbox and boot2docker. And I recreated the docker machine to use more cpus.
# stop`default` docker machine
docker-machine stop default
# delet`default` docker machine,and all images
docker-machine rm default
# create `default` docker machine
docker-machine create -d virtualbox --virtualbox-cpu-count=4 --virtualbox-memory=4096 --virtualbox-disk-size=50000 default
# Restart docker
docker-machine stop
exit
3. create a docker container:
docker run --name dealii_vs -w /home/dealii -i -t -d -v /c/Users/cheng:/home/dealii/shared -p 192.168.99.100:8022:22  -p 192.168.99.100:8023-8025:8023-8025 --cap-add=SYS_PTRACE dealii/dealii:latest
--cap-add=SYS_PTRACE is necessary for gdbserver.
docker exec -u root -it dealii_vs bash # use root to do something inside
4. configure inside of the docker container
apt-get update 
apt-get install openssh-server gdb gdbserver zip vim-nox -y  # download some software, vim-nox is not necessary.
# newer cmake, vs2017 need cmake 3.8+
# install to /opt/cmake/3.12.0
mkdir -p /opt/cmake/3.12.0
./cmake-3.12.0-Linux-x86_64.sh --skip-license --prefix=/opt/cmake/3.12.0 --exclude-subdir

# modify sshd to auto load some env_vars.
# vs 2017 is using ssh to run commands remotely in `non-interactive` shell, which won't load `~/.bashrc` or docker's `ENV`
# however, opensshd has an option to load some env_vars even in `non-interactive` shell
cat >>/etc/ssh/sshd_config <<EOF
# add by Di Cheng
PermitUserEnvironment yes
EOF
# add environment variable, almost identical to output of `docker exec dealii_vs env`
mkdir -p /home/dealii/.ssh
touch /home/dealii/.ssh/environment
cat >/home/dealii/.ssh/environment <<EOF
LANG=en_US.UTF-8
LANGUAGE=en_US:en
LC_ALL=en_US.UTF-8
HOME=/home/dealii
USER=dealii
CC=mpicc
CXX=mpicxx
FC=mpif90
FF=mpif77
ARPACK_DIR=/home/dealii/libs/arpack-ng-master
HDF5_DIR=/home/dealii/libs/hdf5-1.8.15-patch1
OPENCASCADE_DIR=/home/dealii/libs/oce-OCE-0.17
P4EST_DIR=/home/dealii/libs/p4est-2.0
METIS_DIR=/home/dealii/libs/parmetis-4.0.3
PARMETIS_DIR=/home/dealii/libs/parmetis-4.0.3
PETSC_DIR=/home/dealii/libs/petsc-3.6.4
SLEPC_DIR=/home/dealii/libs/slepc-3.6.0
SUPERLU_DIR=/home/dealii/libs/superlu_dist_5.1.2
TRILINOS_DIR=/home/dealii/libs/trilinos-release-12-10-1
DEAL_II_DIR=/home/dealii/dealii-master
PATH=/opt/cmake/3.12.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
EOF
# cat /home/dealii/.ssh/environment

echo "dealii:dealii" | chpasswd # modify password
apt-get clean  # clean for docker commit

service ssh start  #start sshd

exit  # return to windows

5. I tried to use cmake plugins of vs2017. It works. I can compile and debug step by step. But a lot of modification to the VSC-like json configuration files is needed. But I do not like cmake very much because it hides a lot of things.

{ # sample CMakeSettings.json
            "name": "Linux-Debug",
            "generator": "Unix Makefiles",
    # use first one in  Tools>Options>CrossPlatform>ConnectionManager by default.
            "remoteMachineName": "192.168.99.100",  
            "configurationType": "Debug",
            "remoteCMakeListsRoot": "/var/tmp/src/${workspaceHash}/${name}",
    # cmake location
            "cmakeExecutable": "/opt/cmake/3.12.0/bin/cmake",
            "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}",
            "installRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}",
            "remoteBuildRoot": "/var/tmp/build/${workspaceHash}/build/${name}",
            "remoteInstallRoot": "/var/tmp/build/${workspaceHash}/install/${name}",
            "remoteCopySources": true,
            "remoteCopySourcesOutputVerbosity": "Normal",
            "remoteCopySourcesConcurrentCopies": "10",
    # rsync is buggy, use sftp
            "remoteCopySourcesMethod": "sftp",
            "remoteCopyBuildOutput": false,
    # pass -DDEAL_II_DIR=/home/dealii/dealii-master here or pass it by `~/.ssh/environment`
            "cmakeCommandArgs": "",
            "buildCommandArgs": "",
            "ctestCommandArgs": "",
            "inheritEnvironments": [ "linux_x64" ]
        },

6. I tried to figure out what header and libs dealii tutorial code is using, however, OMG:

$ make VERBOSE=1
/usr/bin/cmake -H/home/dealii/shared/dealII/examples/step-1 -B/home/dealii/shared/dealII/examples/step-1 --check-build-system CMakeFiles/Makefile.cmake 0
/usr/bin/cmake -E cmake_progress_start /home/dealii/shared/dealII/examples/step-1/CMakeFiles /home/dealii/shared/dealII/examples/step-1/CMakeFiles/progress.marks
make -f CMakeFiles/Makefile2 all
make[1]: Entering directory '/home/dealii/shared/dealII/examples/step-1'
make -f CMakeFiles/step-1.dir/build.make CMakeFiles/step-1.dir/depend
make[2]: Entering directory '/home/dealii/shared/dealII/examples/step-1'
cd /home/dealii/shared/dealII/examples/step-1 && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /home/dealii/shared/dealII/examples/step-1 /home/dealii/shared/dealII/examples/step-1 /home/dealii/shared/dealII/examples/step-1 /home/dealii/shared/dealII/examples/step-1 /home/dealii/shared/dealII/examples/step-1/CMakeFiles/step-1.dir/DependInfo.cmake --color=
make[2]: Leaving directory '/home/dealii/shared/dealII/examples/step-1'
make -f CMakeFiles/step-1.dir/build.make CMakeFiles/step-1.dir/build
make[2]: Entering directory '/home/dealii/shared/dealII/examples/step-1'
[ 50%] Building CXX object CMakeFiles/step-1.dir/step-1.cc.o
/usr/bin/mpicxx   -DDEBUG -DTBB_DO_ASSERT=1 -DTBB_USE_DEBUG -isystem /home/dealii/dealii-master/include -isystem /home/dealii/dealii-master/include/deal.II/bundled -isystem /usr/lib/openmpi/include/openmpi/opal/mca/event/libevent2021/libevent -isystem /usr/lib/openmpi/include/openmpi/opal/mca/event/libevent2021/libevent/include -isystem /usr/lib/openmpi/include -isystem /usr/lib/openmpi/include/openmpi -isystem /home/dealii/libs/parmetis-4.0.3/include -isystem /home/dealii/libs/trilinos-release-12-10-1/include -isystem /home/dealii/libs/superlu_dist_5.1.2/include -isystem /home/dealii/libs/petsc-3.6.4/include -isystem /home/dealii/libs/hdf5-1.8.15-patch1/include -isystem /home/dealii/libs/p4est-2.0/FAST/include -isystem /home/dealii/libs/slepc-3.6.0/include  -pedantic -fPIC -Wall -Wextra -Wpointer-arith -Wwrite-strings -Wsynth -Wsign-compare -Wswitch -Woverloaded-virtual  -Wno-literal-suffix -fopenmp-simd -std=c++14 -std=c++14 -Wno-parentheses -Wno-unused-local-typedefs -Og -ggdb -Wa,--compress-debug-sections -o CMakeFiles/step-1.dir/step-1.cc.o -c /home/dealii/shared/dealII/examples/step-1/step-1.cc
[100%] Linking CXX executable step-1
/usr/bin/cmake -E cmake_link_script CMakeFiles/step-1.dir/link.txt --verbose=1
/usr/bin/mpicxx      -rdynamic -Wl,-rpath  -Wl,/usr/lib/openmpi/lib  -Wl,--enable-new-dtags -ggdb CMakeFiles/step-1.dir/step-1.cc.o  -o step-1 -rdynamic /home/dealii/dealii-master/lib/libdeal_II.g.so.9.0.0-pre /home/dealii/libs/p4est-2.0/DEBUG/lib/libp4est.so /home/dealii/libs/p4est-2.0/DEBUG/lib/libsc.so -lz /home/dealii/libs/trilinos-release-12-10-1/lib/libmuelu-adapters.so /home/dealii/libs/trilinos-release-12-10-1/lib/libmuelu-interface.so /home/dealii/libs/trilinos-release-12-10-1/lib/libmuelu.so /home/dealii/libs/trilinos-release-12-10-1/lib/libteko.so /home/dealii/libs/trilinos-release-12-10-1/lib/libstratimikos.so /home/dealii/libs/trilinos-release-12-10-1/lib/libstratimikosbelos.so /home/dealii/libs/trilinos-release-12-10-1/lib/libstratimikosaztecoo.so /home/dealii/libs/trilinos-release-12-10-1/lib/libstratimikosamesos.so /home/dealii/libs/trilinos-release-12-10-1/lib/libstratimikosml.so /home/dealii/libs/trilinos-release-12-10-1/lib/libstratimikosifpack.so /home/dealii/libs/trilinos-release-12-10-1/lib/libifpack2-adapters.so /home/dealii/libs/trilinos-release-12-10-1/lib/libifpack2.so /home/dealii/libs/trilinos-release-12-10-1/lib/libanasazitpetra.so /home/dealii/libs/trilinos-release-12-10-1/lib/libModeLaplace.so /home/dealii/libs/trilinos-release-12-10-1/lib/libanasaziepetra.so /home/dealii/libs/trilinos-release-12-10-1/lib/libanasazi.so /home/dealii/libs/trilinos-release-12-10-1/lib/libamesos2.so /home/dealii/libs/trilinos-release-12-10-1/lib/libbelostpetra.so /home/dealii/libs/trilinos-release-12-10-1/lib/libbelosepetra.so /home/dealii/libs/trilinos-release-12-10-1/lib/libbelos.so /home/dealii/libs/trilinos-release-12-10-1/lib/libml.so /home/dealii/libs/trilinos-release-12-10-1/lib/libifpack.so /home/dealii/libs/trilinos-release-12-10-1/lib/libzoltan2.so /home/dealii/libs/trilinos-release-12-10-1/lib/libpamgen_extras.so /home/dealii/libs/trilinos-release-12-10-1/lib/libpamgen.so /home/dealii/libs/trilinos-release-12-10-1/lib/libamesos.so /home/dealii/libs/trilinos-release-12-10-1/lib/libgaleri-xpetra.so /home/dealii/libs/trilinos-release-12-10-1/lib/libgaleri-epetra.so /home/dealii/libs/trilinos-release-12-10-1/lib/libaztecoo.so /home/dealii/libs/trilinos-release-12-10-1/lib/libisorropia.so /home/dealii/libs/trilinos-release-12-10-1/lib/libxpetra-sup.so /home/dealii/libs/trilinos-release-12-10-1/lib/libxpetra.so /home/dealii/libs/trilinos-release-12-10-1/lib/libthyratpetra.so /home/dealii/libs/trilinos-release-12-10-1/lib/libthyraepetraext.so /home/dealii/libs/trilinos-release-12-10-1/lib/libthyraepetra.so /home/dealii/libs/trilinos-release-12-10-1/lib/libthyracore.so /home/dealii/libs/trilinos-release-12-10-1/lib/libepetraext.so /home/dealii/libs/trilinos-release-12-10-1/lib/libtpetraext.so /home/dealii/libs/trilinos-release-12-10-1/lib/libtpetrainout.so /home/dealii/libs/trilinos-release-12-10-1/lib/libtpetra.so /home/dealii/libs/trilinos-release-12-10-1/lib/libkokkostsqr.so /home/dealii/libs/trilinos-release-12-10-1/lib/libtpetrakernels.so /home/dealii/libs/trilinos-release-12-10-1/lib/libtpetraclassiclinalg.so /home/dealii/libs/trilinos-release-12-10-1/lib/libtpetraclassicnodeapi.so /home/dealii/libs/trilinos-release-12-10-1/lib/libtpetraclassic.so /home/dealii/libs/trilinos-release-12-10-1/lib/libtriutils.so /home/dealii/libs/trilinos-release-12-10-1/lib/libzoltan.so /home/dealii/libs/trilinos-release-12-10-1/lib/libepetra.so /home/dealii/libs/trilinos-release-12-10-1/lib/libsacado.so /home/dealii/libs/trilinos-release-12-10-1/lib/librtop.so /home/dealii/libs/trilinos-release-12-10-1/lib/libteuchoskokkoscomm.so /home/dealii/libs/trilinos-release-12-10-1/lib/libteuchoskokkoscompat.so /home/dealii/libs/trilinos-release-12-10-1/lib/libteuchosremainder.so /home/dealii/libs/trilinos-release-12-10-1/lib/libteuchosnumerics.so /home/dealii/libs/trilinos-release-12-10-1/lib/libteuchoscomm.so /home/dealii/libs/trilinos-release-12-10-1/lib/libteuchosparameterlist.so /home/dealii/libs/trilinos-release-12-10-1/lib/libteuchoscore.so /home/dealii/libs/trilinos-release-12-10-1/lib/libkokkosalgorithms.so /home/dealii/libs/trilinos-release-12-10-1/lib/libkokkoscontainers.so /home/dealii/libs/trilinos-release-12-10-1/lib/libkokkoscore.so /home/dealii/libs/superlu_dist_5.1.2/lib/libsuperlu_dist.so /home/dealii/libs/arpack-ng-master/lib/libarpack.so -lrt -lgsl -lgslcblas /home/dealii/libs/hdf5-1.8.15-patch1/lib/libhdf5_hl.so /home/dealii/libs/hdf5-1.8.15-patch1/lib/libhdf5.so -lnetcdf_c++ -lnetcdf -lc /home/dealii/libs/slepc-3.6.0/lib/libslepc.so /home/dealii/libs/petsc-3.6.4/lib/libpetsc.so /home/dealii/libs/petsc-3.6.4/lib/libHYPRE.a /home/dealii/libs/petsc-3.6.4/lib/libcmumps.a /home/dealii/libs/petsc-3.6.4/lib/libdmumps.a /home/dealii/libs/petsc-3.6.4/lib/libsmumps.a /home/dealii/libs/petsc-3.6.4/lib/libzmumps.a /home/dealii/libs/petsc-3.6.4/lib/libmumps_common.a /home/dealii/libs/petsc-3.6.4/lib/libpord.a /home/dealii/libs/petsc-3.6.4/lib/libscalapack.a -llapack -lblas /home/dealii/libs/parmetis-4.0.3/lib/libparmetis.so /home/dealii/libs/parmetis-4.0.3/lib/libmetis.so -lhwloc -lmpi_usempif08 -lmpi_usempi_ignore_tkr -lmpi_mpifh -lgfortran -lquadmath -lm -lmpi_cxx -lmpi -lpthread -ldl -Wl,-rpath,/home/dealii/dealii-master/lib:/home/dealii/libs/p4est-2.0/DEBUG/lib:/home/dealii/libs/trilinos-release-12-10-1/lib:/home/dealii/libs/superlu_dist_5.1.2/lib:/home/dealii/libs/arpack-ng-master/lib:/home/dealii/libs/hdf5-1.8.15-patch1/lib:/home/dealii/libs/slepc-3.6.0/lib:/home/dealii/libs/petsc-3.6.4/lib:/home/dealii/libs/parmetis-4.0.3/lib
make[2]: Leaving directory '/home/dealii/shared/dealII/examples/step-1'
[100%] Built target step-1
make[1]: Leaving directory '/home/dealii/shared/dealII/examples/step-1'
/usr/bin/cmake -E cmake_progress_start /home/dealii/shared/dealII/examples/step-1/CMakeFiles 0

and I found the libraries are so huge, especially the debug lib:  

root@a9f8aab1d09c:~/dealii-master/lib# ll -h
total 1.8G
drwxr-xr-x 3 dealii dealii 4.0K Mar 15 00:15 ./
drwxr-xr-x 5 dealii dealii 4.0K Mar 15 00:19 ../
drwxr-xr-x 3 dealii dealii 4.0K Mar 15 00:15 cmake/
lrwxrwxrwx 1 dealii dealii   25 Mar 15 00:15 libdeal_II.g.so -> libdeal_II.g.so.9.0.0-pre
-rw-r--r-- 1 dealii dealii 1.6G Mar 15 00:15 libdeal_II.g.so.9.0.0-pre
lrwxrwxrwx 1 dealii dealii   23 Mar 15 00:15 libdeal_II.so -> libdeal_II.so.9.0.0-pre
-rw-r--r-- 1 dealii dealii 172M Mar 15 00:14 libdeal_II.so.9.0.0-pre

I doubt if this is a good practice?

My problem: How to parse the dealii code using intellisense remotely? 

I would like to compile the project using traditional way and I want to use intellisense of vs 2017 to give me more information when I am debugging. 


But why a simple tutorial used so many libraries? it loads 106 libraries! 


程迪

unread,
Aug 8, 2018, 11:07:28 AM8/8/18
to deal.II User Group

Hi everyone,

I just figured it out. According to https://github.com/Microsoft/VSLinux/issues/272 ,the intellisense works if CMakeSettings.json file is like this: 
{
    // See https://go.microsoft.com//fwlink//?linkid=834763 for more information about this file.
    "environments": [
        {
            "environment": "IS_includes", // this is used for intelliSense
            // ${env.USERPROFILE} == c:\Users\<userName>
            // ${env.LOCALAPPDATA} == c:\Users\<userName>\AppData\Local
            "INCLUDE": "${env.INCLUDE};${env.USERPROFILE}\\dealII\\dealii_lib\\include;${env.LOCALAPPDATA}\\Microsoft\\Linux\\Header Cache\\1.0\\919434520\\usr\\include"
        }
    ],
    "configurations": [
        {
            "name": "Linux-Debug",
            "generator": "Unix Makefiles",
            "remoteMachineName": "192.168.99.100",
            "configurationType": "Debug",
            "remoteCMakeListsRoot": "/var/tmp/src/${workspaceHash}/${name}",
            "cmakeExecutable": "/opt/cmake/3.12.0/bin/cmake",
            "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}",
            "installRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}",
            "remoteBuildRoot": "/var/tmp/build/${workspaceHash}/build/${name}",
            "remoteInstallRoot": "/var/tmp/build/${workspaceHash}/install/${name}",
            "remoteCopySources": true,
            "remoteCopySourcesOutputVerbosity": "Normal",
            "remoteCopySourcesConcurrentCopies": "10",
            "remoteCopySourcesMethod": "sftp",
            "remoteCopyBuildOutput": true,
            "cmakeCommandArgs": "",
            "buildCommandArgs": "",
            "ctestCommandArgs": "",
            "inheritEnvironments": [ "linux_x64", "IS_includes" ]
        },

Jean-Paul Pelteret

unread,
Aug 8, 2018, 11:15:17 AM8/8/18
to dea...@googlegroups.com
Hi there,

I’m really happy to hear that you managed to work this out for yourself, and thanks a lot for posting your solution! I’m sure that will be very useful to our other Visual Studio users in the future.

Best,
Jean-Paul

--
The deal.II project is located at http://www.dealii.org/
For mailing list/forum options, see https://groups.google.com/d/forum/dealii?hl=en
---
You received this message because you are subscribed to the Google Groups "deal.II User Group" group.
To unsubscribe from this group and stop receiving emails from it, send an email to dealii+un...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Wolfgang Bangerth

unread,
Aug 13, 2018, 3:38:16 PM8/13/18
to dea...@googlegroups.com
On 08/08/2018 09:07 AM, 程迪 wrote:
>
> I just figured it out. According to
> https://github.com/Microsoft/VSLinux/issues/272 ,the intellisense works
> if CMakeSettings.json file is like this:

Like Jean-Paul already said, thanks for posting this! Would you be
interested in adding something to the VisualStudio part of the wiki page
here?
https://github.com/dealii/dealii/wiki/Windows
I'm sure that would be useful to others, and the wiki page seems to be
the common place where we collect Windows-specific information.

Best
W.

--
------------------------------------------------------------------------
Wolfgang Bangerth email: bang...@colostate.edu
www: http://www.math.colostate.edu/~bangerth/
Reply all
Reply to author
Forward
0 new messages