Changeset 83083 in vbox
- Timestamp:
- Feb 15, 2020 2:23:57 AM (5 years ago)
- svn:sync-xref-src-repo-rev:
- 136138
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Debugger/DBGPlugInDarwin.cpp
r82968 r83083 30 30 #include <iprt/ctype.h> 31 31 #include <iprt/formats/mach-o.h> 32 33 #undef LogRel2 34 #define LogRel2 LogRel 32 35 33 36 … … 165 168 if (RT_FAILURE(rc)) 166 169 { 167 Log (("dbgDiggerDarwinIDmsg_QueryKernelLog: failed to read _msgbufp at %RGv: %Rrc\n", Addr.FlatPtr, rc));170 LogRel(("dbgDiggerDarwinIDmsg_QueryKernelLog: failed to read _msgbufp at %RGv: %Rrc\n", Addr.FlatPtr, rc)); 168 171 return VERR_NOT_FOUND; 169 172 } 170 173 if (!OSX_VALID_ADDRESS(pData->f64Bit, GCPtrMsgBufP)) 171 174 { 172 Log (("dbgDiggerDarwinIDmsg_QueryKernelLog: Invalid address for _msgbufp: %RGv\n", GCPtrMsgBufP));175 LogRel(("dbgDiggerDarwinIDmsg_QueryKernelLog: Invalid address for _msgbufp: %RGv\n", GCPtrMsgBufP)); 173 176 return VERR_NOT_FOUND; 174 177 } … … 179 182 if (RT_FAILURE(rc)) 180 183 { 181 Log (("dbgDiggerDarwinIDmsg_QueryKernelLog: failed to find _msgbufp and _msgbuf: %Rrc\n", rc));184 LogRel(("dbgDiggerDarwinIDmsg_QueryKernelLog: failed to find _msgbufp and _msgbuf: %Rrc\n", rc)); 182 185 return VERR_NOT_FOUND; 183 186 } … … 185 188 if (!OSX_VALID_ADDRESS(pData->f64Bit, GCPtrMsgBufP)) 186 189 { 187 Log (("dbgDiggerDarwinIDmsg_QueryKernelLog: Invalid address for _msgbuf: %RGv\n", GCPtrMsgBufP));190 LogRel(("dbgDiggerDarwinIDmsg_QueryKernelLog: Invalid address for _msgbuf: %RGv\n", GCPtrMsgBufP)); 188 191 return VERR_NOT_FOUND; 189 192 } … … 205 208 if (RT_FAILURE(rc)) 206 209 { 207 Log (("dbgDiggerDarwinIDmsg_QueryKernelLog: failed to read msgbuf struct at %RGv: %Rrc\n", Addr.FlatPtr, rc));210 LogRel(("dbgDiggerDarwinIDmsg_QueryKernelLog: failed to read msgbuf struct at %RGv: %Rrc\n", Addr.FlatPtr, rc)); 208 211 return VERR_NOT_FOUND; 209 212 } … … 221 224 || !OSX_VALID_ADDRESS(pData->f64Bit, MsgBuf.msg_bufc) ) 222 225 { 223 Log (("dbgDiggerDarwinIDmsg_QueryKernelLog: Invalid MsgBuf data: magic=%#x size=%#x bufx=%#x bufr=%#x bufc=%RGv\n",224 MsgBuf.msg_magic, MsgBuf.msg_size, MsgBuf.msg_bufx, MsgBuf.msg_bufr, MsgBuf.msg_bufc));226 LogRel(("dbgDiggerDarwinIDmsg_QueryKernelLog: Invalid MsgBuf data: magic=%#x size=%#x bufx=%#x bufr=%#x bufc=%RGv\n", 227 MsgBuf.msg_magic, MsgBuf.msg_size, MsgBuf.msg_bufx, MsgBuf.msg_bufr, MsgBuf.msg_bufc)); 225 228 return VERR_INVALID_STATE; 226 229 } … … 232 235 if (!pchMsgBuf) 233 236 { 234 Log (("dbgDiggerDarwinIDmsg_QueryKernelLog: Failed to allocate %#x bytes of memory for the log buffer\n",235 MsgBuf.msg_size));237 LogRel(("dbgDiggerDarwinIDmsg_QueryKernelLog: Failed to allocate %#x bytes of memory for the log buffer\n", 238 MsgBuf.msg_size)); 236 239 return VERR_INVALID_STATE; 237 240 } … … 299 302 } 300 303 else 301 Log(("dbgDiggerDarwinIDmsg_QueryKernelLog: Error reading %#x bytes at %RGv: %Rrc\n", MsgBuf.msg_size, MsgBuf.msg_bufc, rc)); 304 LogRel(("dbgDiggerDarwinIDmsg_QueryKernelLog: Error reading %#x bytes at %RGv: %Rrc\n", 305 MsgBuf.msg_size, MsgBuf.msg_bufc, rc)); 302 306 RTMemFree(pchMsgBuf); 303 307 return rc; … … 389 393 dbgDiggerDarwinTerm(pUVM, pvData); 390 394 return dbgDiggerDarwinInit(pUVM, pvData); 395 } 396 397 398 /** 399 * Helper function that tries to accertain whether a segment (__LINKEDIT) is 400 * present or not. 401 * 402 * @returns true if present, false if not. 403 * @param pUVM The user mode VM structure. 404 * @param uSegAddr The segment addresss. 405 * @param cbSeg The segment size. 406 * @param uMinAddr Lowest allowed address. 407 * @param uMaxAddr Highest allowed address. 408 */ 409 static int dbgDiggerDarwinIsSegmentPresent(PUVM pUVM, uint64_t uSegAddr, uint64_t cbSeg, uint64_t uMinAddr, uint64_t uMaxAddr) 410 { 411 /* 412 * Validate the size and address. 413 */ 414 if (cbSeg < 32) 415 { 416 LogRel(("OSXDig: __LINKEDIT too small %#RX64\n", cbSeg)); 417 return false; 418 } 419 if (cbSeg > uMaxAddr - uMinAddr) 420 { 421 LogRel(("OSXDig: __LINKEDIT too big %#RX64, max %#RX64\n", cbSeg, uMaxAddr - uMinAddr)); 422 return false; 423 } 424 425 if (uSegAddr < uMinAddr) 426 { 427 LogRel(("OSXDig: __LINKEDIT too low %#RX64, min %#RX64\n", uSegAddr, uMinAddr)); 428 return false; 429 } 430 if (uSegAddr > uMaxAddr) 431 { 432 LogRel(("OSXDig: __LINKEDIT too high %#RX64, max %#RX64\n", uSegAddr, uMaxAddr)); 433 return false; 434 } 435 if (uSegAddr + cbSeg > uMaxAddr) 436 { 437 LogRel(("OSXDig: __LINKEDIT ends too high %#RX64 (%#RX64+%#RX64), max %#RX64\n", 438 uSegAddr + cbSeg, uSegAddr, cbSeg, uMaxAddr)); 439 return false; 440 } 441 442 /* 443 * Check that all the pages are present. 444 */ 445 cbSeg += uSegAddr & X86_PAGE_OFFSET_MASK; 446 uSegAddr &= ~(uint64_t)X86_PAGE_OFFSET_MASK; 447 for (;;) 448 { 449 uint8_t abBuf[8]; 450 DBGFADDRESS Addr; 451 int rc = DBGFR3MemRead(pUVM, 0 /*idCpu*/, DBGFR3AddrFromFlat(pUVM, &Addr, uSegAddr), abBuf, sizeof(abBuf)); 452 if (RT_FAILURE(rc)) 453 { 454 LogRel(("OSXDig: __LINKEDIT read error at %#RX64: %Rrc\n", uSegAddr, rc)); 455 return false; 456 } 457 458 /* Advance */ 459 if (cbSeg <= X86_PAGE_SIZE) 460 return true; 461 cbSeg -= X86_PAGE_SIZE; 462 uSegAddr += X86_PAGE_SIZE; 463 } 391 464 } 392 465 … … 506 579 if (!dbgDiggerDarwinIsValidSegOrSectName(uLCmd.pSeg32->segname, sizeof(uLCmd.pSeg32->segname))) 507 580 return VERR_INVALID_NAME; 508 if (!strcmp(uLCmd.pSeg32->segname, "__LINKEDIT")) 581 if ( !strcmp(uLCmd.pSeg32->segname, "__LINKEDIT") 582 && !dbgDiggerDarwinIsSegmentPresent(pUVM, uLCmd.pSeg32->vmaddr, uLCmd.pSeg32->vmsize, 583 uModAddr, uModAddr + _64M)) 509 584 break; /* This usually is discarded or not loaded at all. */ 510 585 if (cSegs >= RT_ELEMENTS(aSegs)) … … 525 600 if (!dbgDiggerDarwinIsValidSegOrSectName(uLCmd.pSeg64->segname, sizeof(uLCmd.pSeg64->segname))) 526 601 return VERR_INVALID_NAME; 527 if (!strcmp(uLCmd.pSeg64->segname, "__LINKEDIT")) 602 if ( !strcmp(uLCmd.pSeg64->segname, "__LINKEDIT") 603 && !dbgDiggerDarwinIsSegmentPresent(pUVM, uLCmd.pSeg64->vmaddr, uLCmd.pSeg64->vmsize, 604 uModAddr, uModAddr + _128M)) 528 605 break; /* This usually is discarded or not loaded at all. */ 529 606 if (cSegs >= RT_ELEMENTS(aSegs)) … … 570 647 break; 571 648 if (iSeg >= cSegs) 649 { 650 LogRel2(("OSXDig: uModAddr=%#RX64 was not found among the segments segments\n", uModAddr)); 572 651 return VERR_ADDRESS_CONFLICT; 652 } 573 653 574 654 /* … … 581 661 if (RT_FAILURE(rc)) 582 662 { 663 /** @todo try open in memory. */ 664 583 665 /* 584 666 * Final fallback is a container module. … … 734 816 if (!OSX_VALID_ADDRESS(f64Bit, AddrModInfo.FlatPtr)) 735 817 { 736 Log (("OSXDig: Invalid kmod_info pointer: %RGv\n", AddrModInfo.FlatPtr));818 LogRel(("OSXDig: Invalid kmod_info pointer: %RGv\n", AddrModInfo.FlatPtr)); 737 819 break; 738 820 } 739 821 if (AddrModInfo.FlatPtr == uKmodValue.u && cIterations != 0) 740 822 { 741 Log (("OSXDig: kmod_info list looped back to the start.\n"));823 LogRel(("OSXDig: kmod_info list looped back to the start.\n")); 742 824 break; 743 825 } 744 826 if (cIterations++ >= 2048) 745 827 { 746 Log (("OSXDig: Too many mod_info loops (%u)\n", cIterations));828 LogRel(("OSXDig: Too many mod_info loops (%u)\n", cIterations)); 747 829 break; 748 830 } … … 761 843 if (RT_FAILURE(rc)) 762 844 { 763 Log (("OSXDig: Error reading kmod_info structure at %RGv: %Rrc\n", AddrModInfo.FlatPtr, rc));845 LogRel(("OSXDig: Error reading kmod_info structure at %RGv: %Rrc\n", AddrModInfo.FlatPtr, rc)); 764 846 break; 765 847 } … … 771 853 if (iInfoVer != OSX_KMOD_INFO_VERSION) 772 854 { 773 Log (("OSXDig: kmod_info @%RGv: Bad info_version %d\n", AddrModInfo.FlatPtr, iInfoVer));855 LogRel(("OSXDig: kmod_info @%RGv: Bad info_version %d\n", AddrModInfo.FlatPtr, iInfoVer)); 774 856 break; 775 857 } … … 780 862 || !dbgDiggerDarwinIsValidName(pszName) ) 781 863 { 782 Log (("OSXDig: kmod_info @%RGv: Bad name '%.*s'\n", AddrModInfo.FlatPtr,783 sizeof(uMod.Info64.name), pszName));864 LogRel(("OSXDig: kmod_info @%RGv: Bad name '%.*s'\n", AddrModInfo.FlatPtr, 865 sizeof(uMod.Info64.name), pszName)); 784 866 break; 785 867 } … … 789 871 || !dbgDiggerDarwinIsValidVersion(pszVersion) ) 790 872 { 791 Log (("OSXDig: kmod_info @%RGv: Bad version '%.*s'\n", AddrModInfo.FlatPtr,873 LogRel(("OSXDig: kmod_info @%RGv: Bad version '%.*s'\n", AddrModInfo.FlatPtr, 792 874 sizeof(uMod.Info64.version), pszVersion)); 793 875 break; … … 797 879 if (cRefs < -1 || cRefs > 16384) 798 880 { 799 Log (("OSXDig: kmod_info @%RGv: Bad reference_count %d\n", AddrModInfo.FlatPtr, cRefs));881 LogRel(("OSXDig: kmod_info @%RGv: Bad reference_count %d\n", AddrModInfo.FlatPtr, cRefs)); 800 882 break; 801 883 } … … 804 886 if (!OSX_VALID_ADDRESS(f64Bit, uImageAddr)) 805 887 { 806 Log (("OSXDig: kmod_info @%RGv: Bad address %#llx\n", AddrModInfo.FlatPtr, uImageAddr));888 LogRel(("OSXDig: kmod_info @%RGv: Bad address %#llx\n", AddrModInfo.FlatPtr, uImageAddr)); 807 889 break; 808 890 } … … 811 893 if (cbImage > 64U*_1M) 812 894 { 813 Log (("OSXDig: kmod_info @%RGv: Bad size %#llx\n", AddrModInfo.FlatPtr, cbImage));895 LogRel(("OSXDig: kmod_info @%RGv: Bad size %#llx\n", AddrModInfo.FlatPtr, cbImage)); 814 896 break; 815 897 } … … 818 900 if (cbHdr > 16U*_1M) 819 901 { 820 Log (("OSXDig: kmod_info @%RGv: Bad hdr_size %#llx\n", AddrModInfo.FlatPtr, cbHdr));902 LogRel(("OSXDig: kmod_info @%RGv: Bad hdr_size %#llx\n", AddrModInfo.FlatPtr, cbHdr)); 821 903 break; 822 904 } … … 825 907 if (!uStartAddr && !OSX_VALID_ADDRESS(f64Bit, uStartAddr)) 826 908 { 827 Log (("OSXDig: kmod_info @%RGv: Bad start function %#llx\n", AddrModInfo.FlatPtr, uStartAddr));909 LogRel(("OSXDig: kmod_info @%RGv: Bad start function %#llx\n", AddrModInfo.FlatPtr, uStartAddr)); 828 910 break; 829 911 } … … 832 914 if (!uStopAddr && !OSX_VALID_ADDRESS(f64Bit, uStopAddr)) 833 915 { 834 Log (("OSXDig: kmod_info @%RGv: Bad stop function %#llx\n", AddrModInfo.FlatPtr, uStopAddr));916 LogRel(("OSXDig: kmod_info @%RGv: Bad stop function %#llx\n", AddrModInfo.FlatPtr, uStopAddr)); 835 917 break; 836 918 } … … 839 921 * Try add the module. 840 922 */ 841 Log (("OSXDig: kmod_info @%RGv: '%s' ver '%s', image @%#llx LB %#llx cbHdr=%#llx\n", AddrModInfo.FlatPtr,842 pszName, pszVersion, uImageAddr, cbImage, cbHdr));923 LogRel(("OSXDig: kmod_info @%RGv: '%s' ver '%s', image @%#llx LB %#llx cbHdr=%#llx\n", AddrModInfo.FlatPtr, 924 pszName, pszVersion, uImageAddr, cbImage, cbHdr)); 843 925 rc = dbgDiggerDarwinAddModule(pThis, pUVM, uImageAddr, pszName, NULL); 844 926 … … 851 933 } 852 934 else 853 Log (("OSXDig: Error reading the 'kmod' variable: %Rrc\n", rc));935 LogRel(("OSXDig: Error reading the 'kmod' variable: %Rrc\n", rc)); 854 936 } 855 937 else 856 Log (("OSXDig: Failed to locate the 'kmod' variable in mach_kernel.\n"));938 LogRel(("OSXDig: Failed to locate the 'kmod' variable in mach_kernel.\n")); 857 939 858 940 pThis->fValid = true;
Note:
See TracChangeset
for help on using the changeset viewer.