public synchronized ArrayList<DebugSignature> debugSignatures(Function func, int timeoutSecs,
			TaskMonitor monitor) {
		decompileMessage = "";
		if (monitor != null && monitor.isCancelled()) {
			return null;
		}

		if (monitor != null) {
			monitor.addCancelledListener(monitorListener);
		}
		Decoder decoder = null;
		try {
			Address funcEntry = func.getEntryPoint();
			decompCallback.setFunction(func, funcEntry, null);
			verifyProcess();
			EncodeDecodeSet activeSet = setupEncodeDecode(funcEntry);
			decoder = activeSet.mainResponse;
			activeSet.mainQuery.clear();
			AddressXML.encode(activeSet.mainQuery, funcEntry);
			decompProcess.sendCommandTimeout("debugSignatures", timeoutSecs, activeSet);
			decompileMessage = decompCallback.getNativeMessage();
		}
		catch (Exception ex) {
			decompileMessage = "Exception while debugging signatures: " + ex.getMessage() + '\n';
		}
		finally {
			if (monitor != null) {
				monitor.removeCancelledListener(monitorListener);
			}
		}
		flushCache();
		if (!decoder.isEmpty()) {
			try {
				return DebugSignature.decodeSignatures(decoder, func);
			}
			catch (DecoderException e) {
				decompileMessage = "Exception while debugging signatures: " + e.getMessage() + '\n';
			}
			catch (Exception e) {			// Error with the underlying stream
				decompileMessage =
					"Error in stream describing signatures: " + e.getMessage() + '\n';
			}
		}
		return null;
	}
Generate a signature, using the current signature settings, for the given function.
The signature is returned as a sequence of features (feature vector). Each feature
is returned as a separate record with additional metadata describing the information
incorporated into it.
@param func is the given function
@param timeoutSecs is the maximum number of seconds to spend decompiling the function
@param monitor is the TaskMonitor
@return the array of feature descriptions
Ghidra/Features/Decompiler/src/main/java/ghidra/app/decompiler/DecompInterface.java