【问题标题】:Determine if a program is running in debug mode确定程序是否在调试模式下运行
【发布时间】:2014-02-26 11:21:22
【问题描述】:

我使用 RubyMine 编写和调试我的 Ruby 2.0 代码。它为此目的使用 ruby​​-debug-ide。我想知道程序是否在调试模式下运行。

我知道有 Ruby $DEBUG 全局变量,但据我了解 ruby​​-debug-ide 没有更改它,因为它没有使用 -d ruby​​ 标志。

如果我使用 Rubymine 调试我的文件,执行的命令如下所示:

/home/user/.rvm/rubies/ruby-2.0.0-p353/bin/ruby -e at_exit{sleep(1)};$stdout.sync=true;$stderr.sync=true;load($0=ARGV.shift) /home/user/.rvm/gems/ruby-2.0.0-p353/gems/ruby-debug-ide-0.4.22/bin/rdebug-ide --disable-int-handler --port 37737 --dispatcher-port 47992 -- /home/user/file.rb

我尝试使用ARGV$0 来确定命令行是否包含字符串'rdebug-ide'ARGV 是一个空数组而$0 只是'/home/user/file.rb',我怎样才能得到RubyMine 执行的完整命令行?

【问题讨论】:

  • 你试过ENV['debugger_host'].nil?
  • ENV['debugger_host'].nil?在这两种情况下都是正确的

标签: ruby ruby-debug


【解决方案1】:

这就是我所做的:

我将以下代码放入 (rails) 操作中,并在调试和非调试模式下对输出进行了比较:

puts ENV.to_hash.to_yaml

我注意到其中一个区别在于ENV['RUBYLIB'](还有IDE_PROCESS_DISPATCHERDEBUGGER_STORED_RUBYLIBRUBYOPTand DEBUGGER_HOST

以下是您的检查方式:

if ENV['RUBYLIB'] =~ /ruby-debug-ide/
  puts 'in debug mode'
else
  puts 'not in debug mode'
end

【讨论】:

  • 有效,至少在 RubyMine + rvm 中有效。谢谢!
  • @PerLundberg 检查我的方法并做你自己的差异来找出适合你环境的方法
  • @Abdo 现在检查。在通过 VSCode 调试器运行时,RUBYLIB 或提到的其他环境变量都没有任何异常值。
  • @PerLundberg 我不使用 VSCode,但我建议更改调试命令(应该有可以添加变量的地方)。现在我正在考虑这个问题/答案,我不确定这是否有用。你试过gem pry-rails 吗?
  • 正如@PerLundberg 提到的,在运行puts ENV.to_hash.to_yaml 的VSCode 上,使用(F5) 或不使用(Ctrl+F5) 调试器返回相同的输出。
【解决方案2】:

你需要全局变量$LOAD_PATH

a = $LOAD_PATH
a.each do |current_path|
    puts 'Debug mode' if current_path.include?('rb/gems')
end

如果我使用调试模式,$LOAD_PATH 有这一行 "/home/username/RubyMine-6.0.2/rb/gems"

【讨论】:

  • 欢迎来到 Stack Overflow!您能否编辑您的答案以包含一个示例,展示如何使用变量 $LOAD_PATH 来实现 OP 想要的?
  • 抱歉误导。对我来说,这个变体只有在干净的 .rb 文件时才有效。但是如果我在我的项目中使用它 - 调试和运行 $LOAD_PATH 都包含'ruby-debug',不知道为什么
猜你喜欢
  • 1970-01-01
  • 2016-12-02
  • 1970-01-01
  • 2016-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
相关资源
最近更新 更多