![](/img/trans.png)
[英]Why do I get in gdb “Cannot access memory at address 0x…” while inspecting a core dump?
[英]Cannot access memory at address 0x48e7458d48c38958 with gdb
我是 gdb 的新手,正在使用 gdb 調試其他人編寫的項目。 在這件作品中:
int CObjectRecognizer::String2StructInput(const StructInstanceInput &input, StructAlgoResult &aResult, SObjectRecInput &inputInfo)
{
try
{
map<string,string> inputmap = input.field;
if(inputmap.find("att") != inputmap.end())
{
inputInfo.m_att = atoi(inputmap["att"].c_str());
}
}
在gdb中,我想檢查inputmap的值,但它給出了一個錯誤信息:
(gdb) next
899 map<string,string> inputmap = input.field;
(gdb) print inputmap
$1 = std::map with 140737488343904 elements<error reading variable: Cannot access memory at address 0x48e7458d48c38958>
(gdb)
為什么它不能訪問特定地址 0x48e7458d48c38958 處的內存?
編輯:以下建議:
(gdb) print inputmap
$2 = std::map with 0 elements
地圖似乎是空的。 為什么這條線不創建地圖?:
map<string,string> inputmap = input.field;
當 GDB 行或函數入口斷點被擊中,或者當您使用step
或next
命令時,目標程序會在該行中的任何代碼執行之前停止在該行的第一條語句的開頭。
這些語義通常正是您想要的,例如,如果您的程序有一行a[i+j] = b[i] + c[j];
並且您想在它發生之前檢查數組越界訪問。
在您的情況下,該行的語句聲明了一個對象,其地址已知,但在執行該語句之后才會定義其內容,包括對其初始值設定項的調用。 所以此時的print
顯示了對象已知但未初始化的內存的內容。
正如@HolyBlackCat 在評論中建議的那樣,您可以鍵入next
,GDB 將執行當前行的一個或多個語句,包括任何初始化程序和函數調用,並在當前函數中要執行的下一行源代碼處停止[1] . 此時, print inputmap
將顯示正確的值[2] 。
[1] 或其調用者,如果您在返回語句中
[2] 假設它不是 return 語句
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.