1. A method comprising: receiving a responsive function invocation pattern representing a function that is expected to finish within a first time period; receiving a blocking function invocation pattern representing a function that is expected to finish within a second time period, the second time period greater than a pre-defined threshold; receiving a source code file; generating a call graph from the source code, the call graph including at least one call path, each of the at least one call path includes a chain of function invocations; identifying a responsive function invocation in the call graph that matches the responsive function invocation pattern; identifying at least one responsive child function invocation of the responsive function invocation; determining whether one of an identified responsive function invocation and the responsive child function invocation in the call graph matches the blocking function invocation pattern; and if one of the identified responsive function invocation and the responsive child function invocation in the call graph matches the blocking function invocation pattern, outputting that the matched function invocation comprises a soft hang program error, otherwise outputting that no soft hang program errors were identified for the responsive function invocation pattern and the blocking function invocation pattern.