4

Long Story (This is X)

I need to start CLion with sudo so that I can attach gdb to the running process from CLion (for a debugging purpose). The reason is because when I run CLion without sudo, and trying to attach to a process (CLion GUI), I receive:

com.jetbrains.cidr.execution.debugger.backend.gdb.GDBDriver$GDBCommandException: ptrace: Operation not permitted.

As a second check, I tried running gdb in the terminal manually without sudo:

gdb -p 16741

...

Could not attach to process. If your uid matches the uid of the target process, check the setting of "/proc/sys/kernel/yama/ptrace_scope", or try again as the root user. For more details, see "/etc/sysctl.d/10-ptrace.conf"

ptrace: Operation not permitted.

However, if I run gdb with sudo:

sudo gdb -p 16714

...

Attaching to process 16714

So I think I should run CLion as root.


TLDR / The Problem (This is Y)

Now, if running sh /opt/clion/bin/clion.sh from the Ubuntu terminal, CLion does pick up the environment variables sourced in the ~/.bashrc file, and my program compiles with no error.

But because without sudo, I can't attach gdb to the process from within CLion for my debugging purpose, so I need to run the clion.sh startup script as root.

The problem is that when running sudo sh /opt/clion/bin/clion.sh, CLion doesn't seem to pick up the environment variables, leading to "CMake cannot find package ..." error, which makes my program not runnable⁠—worse.

CMake Error at CMakeLists.txt:64 (message):
  find_package(catkin) failed.  catkin was neither found in the workspace nor
  in the CMAKE_PREFIX_PATH.  One reason may be that no ROS setup.sh was
  sourced before.

Question

How do I run the CLion startup script with sudo, and preserve the environment variables that are sourced in ~/.bashrc?


If relevant

  • I think CLion doesn't pick up the following variables. To be very specific, I have this line in my ~/.bashrc file:

    source /opt/ros/kinetic/setup.bash
    

    whose content is

    #!/usr/bin/env bash
    # generated from catkin/cmake/templates/setup.bash.in
    
    CATKIN_SHELL=bash
    
    # source setup.sh from same directory as this file
    _CATKIN_SETUP_DIR=$(builtin cd "`dirname "${BASH_SOURCE[0]}"`" > 
    /dev/null && pwd)
    . "$_CATKIN_SETUP_DIR/setup.sh"
    

    Perhaps, there might be a way to add this directly to the startup script of CLion?

  • XY Problem
  • I am running Ubuntu 16.04
IgNite
  • 221
  • 1
  • 3
  • 9
  • I'll need more coffee before I really understand what you're asking but a couple of observations: (1) `sudo` performs an `env_reset` by default - only preserving a minimal environment (2) `sh` is not `bash` (at least, not by default) and in any case, `.bashrc` is only sourced for interactive shells. Fundamentally, I think this likely *is* an XY problem - see for example [How to solve “ptrace operation not permitted” when trying to attach GDB to a process?](https://stackoverflow.com/a/32274645) – steeldriver Dec 03 '19 at 12:57
  • @steeldriver Thanks for pointing those out to me. I agree that this is likely an XY problem; because I could go with fixing the X, which is `ptrace operation not permitted` when attaching `gdb` to the process problem. And if that solved the problem, I wouldn't need to ask the Y, which is about dealing with `sudo`, environment variables, `sh`, `~/.bashrc`, etc. – IgNite Dec 03 '19 at 14:50
  • There are similar questions: [here](https://stackoverflow.com/questions/45171339/gdb-cannot-attach-to-process), [here](https://stackoverflow.com/questions/37662130/clion-or-cmake-does-not-see-environment-variable), and [here](https://stackoverflow.com/questions/19215177/how-to-solve-ptrace-operation-not-permitted-when-trying-to-attach-gdb-to-a-pro/46676868), but none of them directly answer the question (the Y) that I asked here. – IgNite Dec 03 '19 at 14:53
  • The only workaround that works for me is to look into the `~/.bashrc` file and set `CMAKE_PREFIX_PATH` in CLion accordingly, by pointing this variable to the folder that contains the missing packages. Also set the variables as outlined by this [post](https://stackoverflow.com/questions/37662130/clion-or-cmake-does-not-see-environment-variable). However, `~/.bashrc` is something that I change frequently, so I'm not sure if this is the best way to go. – IgNite Dec 03 '19 at 15:05
  • I guess what I'm saying is that you should fix your kernel parameters so that you don't need to run the IDE with `sudo` - in which case, it will inherit its parent environment (including things like `CMAKE_PREFIX_PATH`, so long as they have been exported) in the usual way – steeldriver Dec 03 '19 at 17:34
  • @steeldriver, I came back to accept your comment as an answer. Modifying `/etc/sysctl.d/10-ptrace.conf` as in the [link](https://stackoverflow.com/questions/19215177/how-to-solve-ptrace-operation-not-permitted-when-trying-to-attach-gdb-to-a-pro/32274645#32274645) that you posted does solve the problem *indirectly*. By modifying this file, I can now attach to a process within CLion without having to run CLion as root (and as usual, running CLion from terminal does pick up the environment variables). – IgNite Jan 09 '20 at 15:26

3 Answers3

0

I came back to accept @steeldriver 's comment as an answer.

Modifying /etc/sysctl.d/10-ptrace.conf as in the link in his comment does solve the problem indirectly.

That is, by modifying this file (changing from 1 to 0), I can now run GDB attach to a process within CLion without having to run CLion as root. And as usual, running CLion from terminal does pick up the environment variables.

IgNite
  • 221
  • 1
  • 3
  • 9
0

Source your variables in .profile not .bashrc.

BeastOfCaerbannog
  • 12,964
  • 10
  • 49
  • 77
0

I'm using Ubuntu 22.04 and got the same problem. My solution is to create another script clion-with-env.sh that setup all the environment variables

#!/bin/bash
source setup-vars.sh
source setup-vars2.sh
export MYVAR=...
...
sh /foo/bar/clion-*/bin/clion.sh

Then modify the application file e.g. /usr/share/applications/jetbrains-clion.desktop, change the Exec option to Exec="/path/to/clion-with-env.sh". This is the file that creates the CLion icon in your launcher. You might need to wait a few seconds or logout to update the settings.

If you want to print something in clion-with-env.sh to debug, you can change the Terminal option to true. Then a terminal will show before CLion starts.

I first tried to use source /home/user/.bashrc, but somehow it didn't work.

Addis
  • 1
  • 1