传递的字符串在gdb中变空?

时间:2015-03-09 04:53:38

标签: c++ string gdb instantiation

我有以下代码:

CrowdSim::Simulation my_simulation;
void printstring(std::string filename)
{
  std::cerr<<"filename= " <<filename<<std::endl;
}

int main(int argc, char* argv[])
{

  std::vector<std::string> tokens;
  std::string filename = "";
  if(argc > 1)
  {
    std::string args(argv[1]);
    split(tokens, args, is_any_of("\"="), token_compress_on);
    filename = tokens.at(1);
  }

  my_simulation = CrowdSim::Simulation();
  printstring(filename);

我使用以下

运行程序
./CrowdSim -filename="Layout/layout_1"

在gdb中,我在printstring(filename)之前放置一个断点。点击此断点时,我执行print filename,输出为"Layout/layout_1"。在输入printstring(踩到step)后,我立即print filename,结果为""

但是,如果我实际让下一行运行,输出就可以了:它打印filename= Layout/layout_1。这是某种gdb错误吗?如果不使用大量的cerr语句,它就很难调试。可能导致这种情况的原因是什么?

此外,如果我注释掉涉及my_simulation的所有行(以便它永远不会被初始化并且我从不使用它),我在步入printstring时会收到错误:

printstring (filename=Traceback (most recent call last):
  File "/usr/share/gdb/python/libstdcxx/v6/printers.py", line 469, in to_string
    return self.val['_M_dataplus']['_M_p'].string (encoding, length = len)
RuntimeError: Error reading string from inferior: Input/output error
) at Source/main.cc:13

我还使用仅包含上述mainprintstring函数的程序对此进行了测试,没有引用任何其他对象。上述错误仍然存​​在。

任何人都可以向我解释这些错误吗?另外,在c ++中有些相关,行CrowdSim::Simulation my_simulation是否自动调用构造函数,因此我不再需要行my_simulation = ...?在Java中,声明一个变量并不构造它(据我所知),所以这两行通常是必要的(我认为)。

0 个答案:

没有答案