Changeset 61561 in vbox
- Timestamp:
- Jun 8, 2016 8:37:19 AM (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Main/src-client/MachineDebuggerImpl.cpp
r61349 r61561 1350 1350 HRESULT MachineDebugger::dumpGuestStack(ULONG aCpuId, com::Utf8Str &aStack) 1351 1351 { 1352 ReturnComNotImplemented(); 1352 /* 1353 * The prologue. 1354 */ 1355 LogFlowThisFunc(("\n")); 1356 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 1357 Console::SafeVMPtr ptrVM(mParent); 1358 HRESULT hrc = ptrVM.rc(); 1359 if (SUCCEEDED(hrc)) 1360 { 1361 PCDBGFSTACKFRAME pFirstFrame; 1362 1363 int vrc = DBGFR3StackWalkBegin(ptrVM.rawUVM(), aCpuId, DBGFCODETYPE_GUEST, &pFirstFrame); 1364 if (RT_SUCCESS(vrc)) 1365 { 1366 /* 1367 * Print header. 1368 */ 1369 try 1370 { 1371 uint32_t fBitFlags = 0; 1372 for (PCDBGFSTACKFRAME pFrame = pFirstFrame; 1373 pFrame; 1374 pFrame = DBGFR3StackWalkNext(pFrame)) 1375 { 1376 uint32_t const fCurBitFlags = pFrame->fFlags & (DBGFSTACKFRAME_FLAGS_16BIT | DBGFSTACKFRAME_FLAGS_32BIT | DBGFSTACKFRAME_FLAGS_64BIT); 1377 if (fCurBitFlags & DBGFSTACKFRAME_FLAGS_16BIT) 1378 { 1379 if (fCurBitFlags != fBitFlags) 1380 aStack.append("SS:BP Ret SS:BP Ret CS:EIP Arg0 Arg1 Arg2 Arg3 CS:EIP / Symbol [line]\n"); 1381 aStack.append(Utf8StrFmt("%04RX16:%04RX16 %04RX16:%04RX16 %04RX32:%08RX32 %08RX32 %08RX32 %08RX32 %08RX32", 1382 pFrame->AddrFrame.Sel, 1383 (uint16_t)pFrame->AddrFrame.off, 1384 pFrame->AddrReturnFrame.Sel, 1385 (uint16_t)pFrame->AddrReturnFrame.off, 1386 (uint32_t)pFrame->AddrReturnPC.Sel, 1387 (uint32_t)pFrame->AddrReturnPC.off, 1388 pFrame->Args.au32[0], 1389 pFrame->Args.au32[1], 1390 pFrame->Args.au32[2], 1391 pFrame->Args.au32[3])); 1392 } 1393 else if (fCurBitFlags & DBGFSTACKFRAME_FLAGS_32BIT) 1394 { 1395 if (fCurBitFlags != fBitFlags) 1396 aStack.append("EBP Ret EBP Ret CS:EIP Arg0 Arg1 Arg2 Arg3 CS:EIP / Symbol [line]\n"); 1397 aStack.append(Utf8StrFmt("%08RX32 %08RX32 %04RX32:%08RX32 %08RX32 %08RX32 %08RX32 %08RX32", 1398 (uint32_t)pFrame->AddrFrame.off, 1399 (uint32_t)pFrame->AddrReturnFrame.off, 1400 (uint32_t)pFrame->AddrReturnPC.Sel, 1401 (uint32_t)pFrame->AddrReturnPC.off, 1402 pFrame->Args.au32[0], 1403 pFrame->Args.au32[1], 1404 pFrame->Args.au32[2], 1405 pFrame->Args.au32[3])); 1406 } 1407 else if (fCurBitFlags & DBGFSTACKFRAME_FLAGS_64BIT) 1408 { 1409 if (fCurBitFlags != fBitFlags) 1410 aStack.append("RBP Ret SS:RBP Ret RIP CS:RIP / Symbol [line]\n"); 1411 aStack.append(Utf8StrFmt("%016RX64 %04RX16:%016RX64 %016RX64", 1412 (uint64_t)pFrame->AddrFrame.off, 1413 pFrame->AddrReturnFrame.Sel, 1414 (uint64_t)pFrame->AddrReturnFrame.off, 1415 (uint64_t)pFrame->AddrReturnPC.off)); 1416 } 1417 1418 if (!pFrame->pSymPC) 1419 aStack.append(Utf8StrFmt(fCurBitFlags & DBGFSTACKFRAME_FLAGS_64BIT 1420 ? " %RTsel:%016RGv" 1421 : fCurBitFlags & DBGFSTACKFRAME_FLAGS_32BIT 1422 ? " %RTsel:%08RGv" 1423 : " %RTsel:%04RGv" 1424 , pFrame->AddrPC.Sel, pFrame->AddrPC.off)); 1425 else 1426 { 1427 RTGCINTPTR offDisp = pFrame->AddrPC.FlatPtr - pFrame->pSymPC->Value; /** @todo this isn't 100% correct for segmented stuff. */ 1428 if (offDisp > 0) 1429 aStack.append(Utf8StrFmt(" %s+%llx", pFrame->pSymPC->szName, (int64_t)offDisp)); 1430 else if (offDisp < 0) 1431 aStack.append(Utf8StrFmt(" %s-%llx", pFrame->pSymPC->szName, -(int64_t)offDisp)); 1432 else 1433 aStack.append(Utf8StrFmt(" %s", pFrame->pSymPC->szName)); 1434 } 1435 if (pFrame->pLinePC) 1436 aStack.append(Utf8StrFmt(" [%s @ 0i%d]", pFrame->pLinePC->szFilename, pFrame->pLinePC->uLineNo)); 1437 aStack.append(Utf8StrFmt("\n")); 1438 1439 fBitFlags = fCurBitFlags; 1440 } 1441 } 1442 catch (std::bad_alloc) 1443 { 1444 hrc = E_OUTOFMEMORY; 1445 } 1446 1447 DBGFR3StackWalkEnd(pFirstFrame); 1448 } 1449 else 1450 hrc = setError(E_FAIL, tr("DBGFR3StackWalkBegin failed with %Rrc"), vrc); 1451 } 1452 1453 return hrc; 1353 1454 } 1354 1455
Note:
See TracChangeset
for help on using the changeset viewer.

