調整BochsはLinux Mintの下でsmbol not foundの問題です。

2654 ワード

私のLinux MintでBochsを使った時、変な問題がありました。http://www.cnblogs.com/long123king/p/3568575.htmlステップ
ヒント:
symbol not found
 そこで、gdbを使ってBochsをデバッグすることにしました。いったい何が起こったのか?
1.どのように構成しますか?conf.linux
CFLAGS/CXFLAGSに-g-O 0を追加します。
2.bochsプログラムを再生成する
sudo make bochs
 3.参考:http://code.google.com/p/stl-debug/
STL容器のデバッグサポートを追加します。
デバッグ:
sudo gdb --args ~/latest_bochs/bochs/bochs -q -f bxrc_custom -rc script_debug_custom
 4.下記のコードを追加します。
symbol_entry_t* context_t::get_symbol_entry(const char *symbol) const
{
  if (m_rsyms.empty())
    return 0;

  symbol_entry_t probe(0, symbol);
  rsym_set_t::const_iterator iter;
  for (std::set::iterator it = m_rsyms.begin();
        it != m_rsyms.end();
        it++)
  {
        unsigned long start = (*it)->start;
        char* name = (*it)->name;
        if (strncmp(name, "start_kernel", strlen("start_kernel")) == 0)
        {
                int kkk = 0;
        }
        dbg_printf("0x%08X : %s
", start, name); continue; } iter=m_rsyms.find(&probe); if(iter==m_rsyms.end()) // No symbol found return 0; return *iter; } ++sym_name;

char *ending = (sym_name + strlen(sym_name) - 1);
while ( isspace(*ending) && ending != sym_name)
{
*(ending--) = '\0';
}

symbol_entry_t* sym = new symbol_entry_t(addr + offset, sym_name);

 int kk=0この行はブレークポイントを設定しています。
Breakpoint 1, context_t::get_symbol_entry (this=0x2860cf0, symbol=0x2860cd0 "start_kernel") at symbols.cc:213
213			int kkk = 0;
(gdb) info locals
kkk = 0
start = 3246113809
name = 0x3155e30 "start_kernel\r"
it = {_M_node = 0x3155e80}
probe = {name = 0x2536e70 "start_kernel", start = 0}
iter = {_M_node = 0x0}
 どうして「\r」が一つ増えましたか?これが問題だと信じています。
add_にsmbolでブレークポイントを設定し、再調整する。
Breakpoint 2, context_t::add_symbol (this=0x2860cf0, sym=0x2860fa0) at symbols.cc:226
226	  m_syms.insert(sym);
(gdb) print sym.start
$1 = 0
(gdb) print sym.name
$2 = 0x2860fc0 "VDSO32_PRELINK\r"
(gdb) 
 問題を確認する
 
解決方法:
bx_にありますdbg_smbol_command関数に以下のコードを追加します。
    ++sym_name;

    char *ending = (sym_name + strlen(sym_name) - 1);
    while ( isspace(*ending) && ending != sym_name)
{
        *(ending--) = '\0';
}

    symbol_entry_t* sym = new symbol_entry_t(addr + offset, sym_name);
 
転載先:https://www.cnblogs.com/long123king/p/3574017.html