private List<RegionDescriptor> analyzeSection(MemoryBlock curMemBlock)
			throws MemoryAccessException, AddressOutOfBoundsException,
			ExceptionHandlerFrameException {

		monitor.setMessage("Analyzing " + curMemBlock.getName() + " section");
		monitor.setShowProgressValue(true);
		monitor.setIndeterminate(false);

		ProgramLocation loc = new ProgramLocation(program, curMemBlock.getStart());
		Address curAddress = loc.getAddress();

		List<RegionDescriptor> regions = new ArrayList<>();

		if (curAddress != null) {
			monitor.setMaximum(curMemBlock.getEnd().subtract(curAddress));
		}

		while (curAddress != null && curAddress.compareTo(curMemBlock.getEnd()) < 0) {
			if (monitor.isCancelled()) {
				return regions;
			}

			/* Get the Common Information Entry */
			Cie cie = getCie(curAddress);

			/* Check for the end of the frame record. */
			if (cie.isEndOfFrame()) {
				break;
			}

			curAddress = cie.getNextAddress();

			/* 
			 * Add each Frame Description Entry (FDE) for the current CIE.
			 */
			List<RegionDescriptor> newRegions = new ArrayList<>();

			while (curAddress != null && (curAddress.compareTo(curMemBlock.getEnd()) < 0)) {

				monitor.setProgress(curAddress.subtract(loc.getAddress()));

				Address currFdeAddr = curAddress;

				try {

					FrameDescriptionEntry fde = new FrameDescriptionEntry(monitor, program, this);
					RegionDescriptor region = fde.create(curAddress);

					if (fde.isEndOfFrame()) {
						break;
					}

					if (region != null) {
						newRegions.add(region);
						createFdeComment(curAddress);
					}

					curAddress = fde.getNextAddress(); // This can be null.

				}
				catch (ExceptionHandlerFrameException efe) {
					// May have run into another CIE.
					curAddress = currFdeAddr;
					break;
				}
			}

			createAugmentationData(newRegions, cie);

			regions.addAll(newRegions);
		}
		return regions;
	}
Analyzes and annotates the debug frame section.
@return the region descriptors that compose the debug frame section.
@throws MemoryAccessException if memory couldn't be read/written while processing the section.
@throws AddressOutOfBoundsException if one or more expected addresses weren't in the program.
@throws ExceptionHandlerFrameException if the FDE table can't be decoded.
Ghidra/Features/Base/src/main/java/ghidra/app/plugin/exceptionhandlers/gcc/sections/DebugFrameSection.java