home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / bsbrowse.zip / intro.txt next >
Text File  |  1994-02-28  |  33KB  |  611 lines

  1.                           The Browser
  2.  
  3.  
  4.  
  5. 1. Introduction
  6.  
  7. Welcome to the Browser. This introduction is intended as a "tour d'horizon" for
  8. programmers who are already familiar with object oriented programming in C++.
  9. It is neither a tutorial nor a marketing brochure. Prepare to read a lot of technical
  10. information.
  11.  
  12. The first thing to learn about the system is that it does a lot more than just browsing.
  13. The Browser is a full scale C++ development system that covers the following
  14. programming tasks:
  15.  
  16.      Source Management (browse, edit and document C++ sources)
  17.      Change Management (keep track of class changes and versions)
  18.      Application Building (build and test *.obj, *.exe and *.dll files)
  19.  
  20. The support for each of these tasks is described in the following section. Please use
  21. the screen shots in combination with the text.
  22.  
  23. With respect to the screen shots, it is worth to mention a few things that are characteristic
  24. for all windows / views of the Browser:
  25.  
  26.      most views can have multiple instances
  27.      drag and drop is used as primary interaction scheme for various views
  28.      almost all panes of the described windows have own popup (context) menus
  29.  
  30. These things are easy to use and demonstrate but hard to show in a "static display"
  31. of screen shots.
  32.  
  33.  
  34. 2. Supported Programming Tasks
  35.  
  36.  
  37. 2.1 Browse, Edit and Document C++ Classes
  38.  
  39. To support this task, it is most important to provide a mechanism that
  40. enables the user to program in classes and not files. The source code packaging
  41. should be as transparent as possible. All sources should be processed in logical
  42. units (e.g. C++ functions) and should not be treated as raw text. Object oriented
  43. programming with C++ provides some powerful abstraction mechanisms (e.g.
  44. inheritance). But without appropriate tool support it is possible  to get lost in this
  45. "3rd dimension". If the user has to remember class definitions, class to file mapping,
  46. inheritance graphs etc., it is most likely that productivity will even suffer compared with
  47. simpler programming paradigms. To be a successful OO programmer, you have to
  48. understand both the programming language and your class library.
  49.  
  50.  
  51. SCR_1.BMP : Navigate through your classes
  52.  
  53. ┌──────────┐
  54. │    3     │            1: Controller
  55. │          │            2: HierarchyViewer
  56. │        ┌────────┐     3: ClassEditor
  57. └────────│   2    │
  58. ┌───────┐│        │
  59. │   1   │└────────┘
  60. └───────┘
  61.  
  62. This picture already shows the most frequently used views of the Browser. The first
  63. window that comes up after starting the system is the Controller. It logs all programming
  64. activities (login, function changes etc.) , can be used to start additional tools and terminates
  65. a Browser session if it is closed. This is the only window that can not have multiple instances
  66. concurrently.
  67.  
  68. The first thing to do after the system is initialized would be to locate the classes to do
  69. some work on. This is done with the HierarchyViewer. It is subdivided into four panes:
  70.  
  71.      AttributePane : upper left
  72.      DirectoryPane: upper right
  73.      GraphPane : lower right
  74.      ClassPane : lower left
  75.  
  76. The DirectoryPane shows the directories where the Browser is looking for C++ sources. These
  77. directories are searched from top to bottom (i.e. if a class is found in more than one dir,
  78. the first occurrence will be used). This directory list - like many other things - can be
  79. set in a user configuration file. If a particular class is selected (by mouse click in the ClassPane) ,
  80. the selection in the DirectoryPane is set on the directory where this class resides. If a directory is
  81. selected (by mouse click in the DirectoryPane), a small mark appears in front of this line and the
  82. ClassPane shows only the classes residing in the selected dir.
  83.  
  84. The AttributePane can be used to specify attributes that are used to filter the ClassPane
  85. contents. Only classes that have these attributes are displayed (works also with negation).
  86. Attributes are user defined names (e.g. "PM" for Presentation Manager related class) that
  87. can be attached to classes.
  88.  
  89. The ClassPane shows a list of all matching classes (with appropriate attributes or with
  90. specified location) in alphabetical order. Most functions used for practical work can be
  91. triggered via the popup menu of this pane. There are functions that work on the selected
  92. class only (e.g. start ClassEditor) as well as functions that work on all displayed classes
  93. (e.g. build / update archive).
  94.  
  95. The GraphPane shows the inheritance relationships of the class selected in the ClassPane.
  96. There are several display options to control how the inheritance graph is build.
  97. If the "bases" option is set, all bases of the ClassPane selection are displayed. If "childs"
  98. is set, all classes derived from the ClassPane selection are displayed. Most of the (single
  99. or group) class manipulation functions mentioned in the ClassPane can be activated from the
  100. GraphPane too. This time, the group is the number of classes displayed in the graph.
  101.  
  102.  
  103. The ClassEditor might be the most important view of all. This window is used to display
  104. and edit a single class. It consists of three panes:
  105.  
  106.      DataPane (upper left)
  107.      FunctionPane (upper right)
  108.      FuncDefPane (lower)
  109.  
  110. The DataPane shows all data members of the class. Each line starts with symbols for the
  111. standard attributes of this data member. The first symbol shows the association (instance,
  112. class or global). The second symbol is used for the access level (private, protected or public).
  113. There is an optional third symbol used for combinations of other attributes (e.g. extern). Next
  114. is the type of the data member followed by the (boldfaced) name of the member. If a line
  115. is selected, the FunctionPane shows only the function members that use the selected
  116. data member. Entering new data members as well as modifying existing ones is done via
  117. a special dialog launched from the DataMembers popup menu. There is also a dialog to
  118. specify which members should be displayed (e.g. to filter out class members). Like the
  119. whole class, members can have user defined attributes too.
  120.  
  121. The FunctionPane does the same job for the function members of a class. . In addition,
  122. TextWindows showing the selected function can be launched via the popup menu of this
  123. pane. This feature enables the user to work on different functions of a class simultaneously
  124. (can be also done with a second ClassEditor on ths same class). All relevant views are updated
  125. automatically in this case.
  126.  
  127. The third attribute symbol mentioned in the Data Pane is used more frequently in the
  128. FunctionPane (e.g. for inline or virtual attributes). If a function is selected in this pane, the
  129. corresponding function definition is displayed in the FuncDefPane.
  130.  
  131. The FuncDefPane is used to display and edit a particular function definition. It always holds
  132. just one function definition at a time. Nothing outside of this function can be manipulated by
  133. this pane. Because it just works on a small piece of text, this editor (which currently is an
  134. enhanced MLE) can be kept very simple and is consistently used in the whole system.
  135. Changes are saved via the popup menu. There are also some hypertext facilities (show
  136. C++ or OS/2 *.INF help or header definitions for the selected word) available via this menu.
  137.  
  138. There is another important aspect on the ClassEditor that has to be mentioned. Users
  139. do not have to deal with the C++ class definition code because it is completely managed by
  140. the ClassEditor. Based on the member definitions (name, type and attributes) the class
  141. definition is generated automatically.
  142.  
  143. There are two more things that can be specified with dedicated dialogs: Imports and Inserts.
  144. Imports map to C++ #includes. They can be entered by drag and drop and are displayed with
  145. class names instead of filenames (ordinary header files can be specified by using their filenames).
  146. Inserts are simply pieces of (unparsed) text that can be merged in the class. The user has complete
  147. control about order and position of imports / inserts (in front of class def, behind class def or in front
  148. of implementation section).
  149.  
  150.  
  151. SCR_2.BMP :  more views to analyze and edit a class
  152.  
  153. ┌──────────┐
  154. │    1 ┌────────┐       1: ClassEditor
  155. ┌────┐ │   2 ┌─────┐    2: FunctionDialog
  156. │ 4  │ │     │  3  │    3: HierarchyViewer
  157. ┌────┐─│     │     │    4: Statistics - Report
  158. │ 5  │ └──── ┌────┐┘    5: Import - Report
  159. │    │       │ 6  │     6: Users - Report
  160. └────┘       └────┘
  161.  
  162.  
  163. This screen shot shows some more windows that can be spawned from a ClassEditor. The
  164. FunctionDialog (already mentioned above) is used to enter new functions and to modify existing
  165. ones. It shows that for many C++ tasks there are no needs to remember the syntactic details
  166. because there is a point-and-click way to do it (e.g. to set a function to private).
  167.  
  168. There are various reports that can be generated for a class. All these reports are displayed
  169. using the same type of TextWindow that can be used to print or modify the report text.
  170. Among the available reports are:
  171.  
  172. The Import Report. This report shows all imports of the class either hierachically (in order of
  173. preprocessor #include) or alphabetically sorted (with all users of the particular import appended).
  174. This is a very useful report to detect import problems (e.g. infinite recursive mutual imports). The
  175. example shows a hierarchical (tree) report.
  176.  
  177. The Users Report. This report shows all users of a class together with the particular import
  178. position (pre, post or implementation).
  179.  
  180. The Statistics Report. This report lists various statistic information for the class (number of
  181. bases, of derived classes, data members, function members, lines of code, number of comments etc.).
  182.  
  183. The HierarchyViewer shows two different display options compared with the first screen shot. It has
  184. a zoomed GraphPane and a "detailed" class display. One of the class group functions of the
  185. GraphPane is to display alphabetically all data and all function members in spawned ListPrompters
  186. from which the user can pick the members that should be displayed in the graph. This is  not a very
  187. useful way to display all members in a class hierarchy, but it is a good feature when focusing on a
  188. specific functionality that works across multiple inheritance levels.
  189.  
  190.  
  191.  
  192.  
  193. 2.2 Keep Track of Class Changes and Versions
  194.  
  195.  
  196. As the number of classes is growing, it becomes more  important to keep track of changes.
  197. This is even more interesting with object oriented programming. Since one of the OOP aims is to
  198. increase code reuse, there are many classes that are used in different projects. Changes of
  199. a reused class caused by one project could have an effect on the other users of this class. If the
  200. class is a potential base class, things may be even more complicated because changes of
  201. implementation details may have an effect too. There is only one way to handle such problems:
  202. a "tight" tracking of all changes. And because changes have to be understood afterwards, it is
  203. again important that the logging is done in logical units (class, member etc.) and not on a simple
  204. file basis (filename, lines).
  205.  
  206. Basis for the Browser logging mechanism is the strict class identification scheme. Each class
  207. file holds information about the location (machine and path) and revision number of the particular
  208. class. Each time a class is modified (e.g. by saving a function definition), the revision number is
  209. increased automatically. This means that every change can be identified by a location specification
  210. and a corresponding revision number (e.g.  "BsaEntry [MyMachine e:\mypath 123]"). This
  211. information is  displayed in various views (e.g. ClassEditor title, Logfile entries etc.).
  212.  
  213.  
  214. SCR_3.BMP : Basic logging mechanisms
  215.  
  216. ┌──────────┐
  217. │    2     │            1: Controller
  218. │          │            2: LogBrowser
  219. │        ┌────────┐     3: ChangeBrowser
  220. └────────│   3    │
  221. ┌───────┐│        │
  222. │   1   │└────────┘
  223. └───────┘
  224.  
  225. As mentioned above, every programming action (saving a function, adding an import etc.) is logged
  226. in the Controller. It is not only displayed but also written to a logfile. The system can be even
  227. configured to use multiple logfiles simultaneously (e.g. one that is private to the user and one that is
  228. shared by a programming group). Each log entry includes information for date, time, user id, operation
  229. (add, modify, remove), class, class location and revision number and the type (e.g. function) and name
  230. of the changed item (e.g. a function name). Even the symbolic machine name is logged to enable
  231. a precise subsequent log analysis. To increase robustness, the logfile is kept open just for the duration
  232. of the write operation.
  233.  
  234. The tool for logfile analysis is the LogfileBrowser. It displays the contents of a logfile in a structured
  235. way suitable for very specific questions (e.g. all function changes of a particular class done by a
  236. particular programmer since a specified date). The panes in the upper half display all change dates,
  237. all changed classes with locations and revision number, all programmers that made changes and
  238. all change operations. Each selection is a filter for all information to the right. Date filtering is done
  239. on a "since" basis (i.e. all changes since that date are displayed). The pane in the lower half lists
  240. all matching log events (in a slightly different order than the Controller). Below the menubar, there
  241. is a list of CheckBoxes for each item type to display (e.g. functions, datas). The number of entries
  242. of this particular type is appended in brackets.
  243.  
  244. For very sensitive change operations (usually for classes with a high fan out), the changed item
  245. description (e.g. function text) can be logged too. This can be done on a per class basis (all changes
  246. for a class are logged to a class related file) and on a session basis (all changes done in a session
  247. are logged in a user selectable file). The class logging can be enabled by a ClassEditor menuitem,
  248. the session logging can be activated by a Controller menuitem. Class logging may also be automated
  249. by giving that class a special attribute (monitor). Each time a ClassEditor is opened on such a class
  250. it automatically logs all changes.
  251.  
  252. To browse through such a change file, the ChangeBrowser is used. Its upper three panes show
  253. the dates, users and change operations that appear in the change file. These panes can be used
  254. to filter the entries displayed in the middle pane in a similiar way like the LogBrowser. The middle
  255. pane shows matching change entries like they are displayed in the ClassEditor (with type name
  256. and all appropriate attributes). For selected function or insert change entries, the changed
  257. definition /  text is displayed in the lower pane. It is even possible to restore changes back to the
  258. current class by using the popup menu for this pane. But this again increases the revision number,
  259. there is no way to decrease it (except by setting up a new Browser system on a fresh copy
  260. of existing classes from another location).
  261.  
  262.  
  263.  
  264. SCR_4.BMP : Archiving class revisions and change files
  265.  
  266. ┌────────────┐
  267. │     1      │          1: ArchiveBrowser
  268. │           ┌───────┐   2: ArchiveViewer
  269. └───────────│   2   │   3: ChangeBrowser
  270. ┌──────────┐│       │   4: ClassEditor (on archived version)
  271. │    4  ┌───└───────┘
  272. │       │    3    │
  273. └───────│         │
  274.         └─────────┘
  275.  
  276. Logging to change files  is a useful mechanism for sensitive operations / classes, but it produces
  277. some overhead that might not be appropriate for all classes all the time. This is where the archive
  278. mechanism comes in.  A Browser archive is  a simple ZIP file that can be handled outside of the
  279. Browser too. Archives are kept in user configurable directories (e.g. on a dedicated server). There
  280. are two types of archives:
  281.  
  282. The Class Archive which is kept on a per class / per location basis (every class in a specific location
  283. has its own class archive). This archive hold two types of files: class revisions and change files.
  284. The first is a complete copy of a revision of the class. The second is a complete copy of a
  285. change file.
  286.  
  287. Group archives contain complete copies of different classes and are used mainly as a delivery
  288. mechanism (e.g. all classes for a particular application, in a particular location etc).
  289.  
  290. To view the contents of all available class archives, the ArchiveBrowser is used. It has two
  291. panes. The left pane shows symbolic names that have been attached to class revision saves
  292. (e.g. "rel 1.1"). If such a name is selected, only the archive entries that have this attribute are
  293. displayed. These names are mainly used to identify class library releases (i.e. a snapshot of
  294. all class revisions at a particular date/time). The right pane shows all matching archive entries
  295. alphabetically sorted by class name. There are a number of options available via a set of buttons
  296. at the top of the window. There is a choice if all or just the most recent archived revisions
  297. of a class are displayed. It is also possible to get the "nearest" archived revision of each class
  298. for a particular date (this is useful to get a "best guess" state of the class library that was not a
  299. named release). By using the popup menu of the entry pane, a (readonly) ClassEditor on the
  300. selected archive entry can be opened.
  301.  
  302. The ArchiveViewer can be used to have a closer look at the contents of a class archive. It
  303. consists of two panes. The upper pane shows all entries (files) contained in the archive. 
  304. Class revision entries are shown with a small symbol and a single revision number. Change
  305. file entries are shown with the range of changes (e.g. "6-7") that are covered by this file.
  306. The lower pane shows multi line comments either for the whole archive or for the selected
  307. archive entry. Existing entries can be expanded to a ClassEditor (for a revision entry) or to a
  308. ChangeBrowser (for a change file entry) by popup menu or doubleclicking. New entries can
  309. be added via menubar (archive current version, archive current change file) and a special archive
  310. dialog. This dialog is used to specify symbolic (release) names as well as the multi line comments.
  311. After a change file has been archived, it is emptied to prevent redundant archiving.
  312.  
  313. To update the class archives for a set of classes, the HierarchyViewer is used instead of opening
  314. an ArchiveViewer for every incorporated class. Therefore it is possible to specify the release
  315. name just once and perform all the archive updates in the background. If the current revision
  316. of a class is found to be already archived, only the release name is appended to the particular
  317. archive entry. There are no mutlpile archive entries for the same revision number of a class.
  318.  
  319.  
  320.  
  321.  
  322.  
  323. SCR_5.BMP : Compare and Merge with a different class set
  324.  
  325. ┌───────────────────┐  
  326. │        1          │   1: DirectoryMerger
  327. │┌───────┐┌────────┐│   2: DirCompareView
  328. ││   2   ││   3    ││   3: ClassCompareView
  329. │└───────┘└────────┘│   4: ClassEditor (on own class)
  330. │┌───────┐┌────────┐│   5: ClassEditor (on extern class)
  331. ││   4   ││   5    ││
  332. │└───────┘└────────┘│
  333. └───────────────────┘
  334.  
  335.  
  336. This screen shot shows the DirectoryMerger which is used to compare the current class
  337. library with the contents of a different directory holding class sources. It is the main tool
  338. to merge different class libraries. The DirectoryMerger has four child windows.
  339.  
  340. The DirCompareView consists of three panes. The upper pane lists the classes that
  341. are found in the library and in the external directory but  which are different. For each
  342. different entry, the location, revision and date is displayed for both the library and the
  343. external version of the class. The most recently changed version is marked.
  344.   The middle pane lists all classes found only in the external directory, the lower pane
  345. lists the classes that are present just in the current class library. Via popup menu, it is
  346. possible to copy a class (or a group of classes) from the external dir to a library location.
  347. If a class is updated from an external location, the own revision number is kept and a
  348. history record stating the source of the update (external location and revision) is added
  349. to the class file.
  350. If an entry in the upper pane (different classes) is selected, three additional views are
  351. opened: a ClassCompareView, a ClassEditor on the library version of the class and
  352. a ClassEditor on the external version of the class. If an entry in one of the lower panes
  353. is selected, only the particular ClassEditor is opened.
  354.  
  355. The ClassCompareView has the same functionality like the DirCompareView with respect
  356. to two different versions of a particular class. It again has three panes that hold different,
  357. external only and library only items of that class. The displayed item type (function, data,
  358. import etc.) is controlled with a set of buttons located at the top of the view. Like in the
  359. LogBrowser, for each item type the number of different/external/own entries is appended
  360. in brackets. When selecting an entry in one of the three panes, both ClassEditors are
  361. positioned on the corresponding item (e.g. a function member), differences are marked
  362. (e.g. different function body lines). Again it is possible to update the own class with the
  363. selected item from the external class via popup menu.
  364.  
  365. There is nothing special about the two ClassEditors except that they are opened in
  366. readonly mode
  367.  
  368.  
  369.  
  370.  
  371. 2.3 Build and Test *.OBJ, *.EXE and *.DLL
  372.  
  373.  
  374. SCR_6.BMP : Building an Application
  375.  
  376. ┌──────────┐
  377. │    3     │            1: ApplicationBuilder
  378. │          │            2: MessageViewer
  379. └──────────┘            3: ClassEditor
  380. ┌───────┐┌────────┐
  381. │   2   ││   1    │
  382. └───────┘│        │
  383.          │        │
  384.          └────────┘
  385.  
  386.  
  387. The tool used to compile class sources into *.obj files and to link objects into executables (or dynamic
  388. link libraries) is the ApplicationBuilder. It represents an interactive substitute of NMAKE.EXE 
  389. and automates all required compiler and linker calls (which are invisible to the user).
  390.  
  391. The view mainly consists of two panes:
  392.  
  393.      ClassPane (upper)
  394.      LibPane (lower)
  395.  
  396. The ApplicaionBuilder can be launched from a HierarchyViewer or a ClassEditor for all classes that
  397. have appropriate attributes (app or dll). When opened,  it determines which classes are required for the
  398. application. Each of these classes is checked if it has an outdated object (older than the source) and
  399. what have been the switches that were used to compile the *.obj.This list is shown in the ClassPane.
  400. The attributes (switches) of each object (e.g. compiled optimized, inline, debug) are shown by several
  401. bitmaps. An already-build-object is marked by the size of the corresponding *.obj file (behind the class
  402. name). If an object has to be be recompiled (e.g. if the class source was changed) it is marked by a cross
  403. in front of the entry. Selective update of one or more entries (e.g. all derived classes of selected one) can
  404. be forced via popup menu. This menu also can be used to launch several analysis and statistic tools
  405. ( users, imports, layers, listings of corresponding *.lst and *.asm files ...).
  406.  
  407. The LibPane shows the list of all *.lib files required for linking the application. This list also is determined
  408. automatically from a (user configurable) library description. The user has complete control over the
  409. library list and can add other libraries as well as remove existing ones via the pane popup menu.
  410.  
  411. The actual build operations ( compile and link) are started by the  barmenu items.
  412.  
  413. <Compile> causes all entries in the ClassPane that are marked for update (optional and required)
  414. to be recompiled due to the switches specified by the ButtonPane at the top of the window. These
  415. switches affect compiler flags ( debug, profile, optimize, inline), generation of additional information files
  416. ( *.map, *.lst, *.asm etc.), and compile / link options for use of several runtime analysis tools
  417. (heaptrace, IXTRA, IPMD). The actual compiler switches (e.g. /O+ for "optimize") can be set in a
  418. configuration file.
  419.  
  420. <Build> starts the compiler (as mentioned above) and, on successful compile, starts the linker to
  421. bind the objects and specified libs. Linkage type depends on selected linker flags ( pm, vio, full).
  422. Due to the attributes of the project a *.dll or *.exe file will be created.
  423.  
  424. A started build cycle may be aborted at any time by <Stop>.
  425.  
  426. When detecting compiler errors the ApplicationBuilder pops up a MessageViewer containing
  427. information about the source error(s). Each entry informs about the file and line number where the
  428. problem is located, as well as the compiler generated error description. Error specific *.INF
  429. information can be shown via the popup menu.
  430.  
  431. To examine and correct an error, this entry can be dragged on a ClassEditor that will be
  432. automatically positioned on the code that caused the error.
  433.  
  434. If an *.exe could be build, it can be started  via the <App> submenu. If special build options were
  435. specified (e.g. debug or profile), the appropriate tool (e.g. IPMD or IXTRA) is started instead of the
  436. application.
  437.  
  438. The <Show> submenu is used to list and analyze additional information files( e.g mapfile, heaptrace)
  439. described below.
  440.  
  441.  
  442.  
  443. SCR_7.BMP : More Views on compiled classes
  444.  
  445. ┌───────────┌────────┐
  446. │     4     │    1   │   1: ApplicationBuilder
  447. │           │        │   2: MapfileViewer
  448. ┌──────────┐└────────┘   3: AsmViewer
  449. │    2     │ ┌───────┐   4: ClassEditor
  450. │          │ │   3   │
  451. │          │ │       │
  452. └──────────┘ └───────┘
  453.  
  454.  
  455. As mentioned above, several additional information files may be generated by the ApplicationBuilder.
  456. This screen shot shows the AsmViewer and the MapfileViewer.
  457.  
  458. Compiling an *.obj with the "asm" attribute will create an *.asm file. This compiler generated assembly
  459. file can be showed in the AsmViewer which consists of two panes. The upper pane lists all public
  460. entries found in the *.asm file. If an entry is selected, the corresponding assembler code is displayed
  461. in the lower pane. This tool is mainly used for optimization problems.
  462.  
  463. The MapfileViewer analyzes a compressed version of the *.map information created for applications build
  464. with the "map" attribute. From top to bottom, it shows a list of the application segments, exported and
  465. imported functions and a list of all public functions of the application (that can be sorted either by name
  466. or address). Selecting a segment filters the function list to all functions located in this segment. Selecting
  467. a function also marks the segment in which this function resides.
  468.  
  469. This tool is very useful to detect locations of runtime errors ( e.g. general protection faults) in
  470. applications build without debug info. For large applications, it often is not feasible to use debug
  471. information for every incorporated class because of the compile speed and executable size.
  472.  
  473. When entering the address of the exception (obtained by the OS/2 exception MessageBox) in the
  474. top left EntryField, the MapfileViewer selects the function where the error occurred. This information often
  475. is appropriate to locate an error in the source code without blowing up the *.exe with debug info. If it is not,
  476. it gives a good starting point for deciding which classes have to be recompiled with debug info.
  477.  
  478.  
  479.  
  480.  
  481. SCR_8.BMP : Addtional Test Tools
  482.  
  483. ┌────────────┐
  484. │     3      │┌───────┐  1: HeapTracer
  485. │            ││   2   │  2: MemTileViewer
  486. └────────────┘└───────┘  3: ClassEditor
  487.       ┌───────────────┐  4: ApplicationBuilder
  488. ┌─────│       1       │
  489. │  4  │               │
  490. │     │               │
  491. └─────└───────────────┘
  492.  
  493.  
  494. An application that was built with the "heaptrace" attribute logs all lifetime heap operations ( new, delete)
  495. in a special file. The file contents may be subsequently analyzed by the HeapTracer. This tool is mainly
  496. used to detect memory leaks.
  497.  
  498.      ModulePane ( upper)
  499.      TypePane ( middle)
  500.      OperationPane ( lower)
  501.  
  502. The ModulePane shows statistic information about classes that issued heap operations ( e.g. number of
  503. new and delete operations, allocated bytes).
  504.  
  505. A type - based view is provided by the TypePane. This pane displays how many instances of a
  506. type (e.g. a class)  were allocated, how many freed, percentage and total byte allocation.
  507.  
  508. Perhaps the most important view is the OperationPane. All heap operations ever made during the
  509. lifetime of the application are shown here in the order of their execution. Each entry consists of the
  510. operation type ( new, delete), its address space, the module ( class) which caused that operation, the
  511. storage type and the allocated memory size. The selected entry can be dragged to an open ClassEditor
  512. which is automatically positioned on the code that performed the heap operation.
  513. The OperationPane contents may be filtered due to the RadioButton selection at left. For example,
  514. selection of "alloc" shows only active (not freed) allocation entries. Depending on the state of the
  515. application, such entries might be memory leaks,
  516.  
  517. Heap space fragmentation can be viewed by the MemTileViewer (which can be launched from
  518. the HeapTracer). This view displays the cluster based memory allocation for a specified memory range.
  519. It is useful for the development of own heap managers.
  520.  
  521.  
  522.  
  523.  
  524. 3. Networking
  525.  
  526.  
  527. The Browser can be used in a networking environment. The usual network configuration
  528. (that can be modified by the user) has a set of (server) directories which hold the
  529. classes that are visible to all programmers. In addition, each programmer has one or
  530. more (local) directories for private classes or classes that are not yet ready for an upload to a
  531. public directory.
  532.  
  533. Classes also can be locked. All users except the owner (who locked it) have just readonly
  534. access to such a class. Lock information (who locked it when for what purpose) is displayed
  535. when accessing a locked class.
  536.  
  537.  
  538.  
  539. 4. Requirements
  540.  
  541.  
  542.       OS/2 2.1
  543.       IBM C/Set++
  544.       4 MB disk space (for the binaries)
  545.  
  546.       1024 x 768 display (or above) recommended
  547.       486 processor recommended
  548.       >= 8 MB recommended
  549.  
  550. Even if this depends on personal preferences, it is strongly felt that an appropriate display
  551. system is among the top priorities of this requirement list. Much of the Browsers productivity
  552. momentum depends on being able to deal with a lot of information simultaneously. This is
  553. simply not possible to achieve on a 640x468 VGA display.
  554.  
  555. Since many Browser operations make heavy usage of the file system, a fast harddisk should
  556. be installed ( < 20 ms).
  557.  
  558.  
  559. 5. Experiences
  560.  
  561. Originally the Browser was intended to be just an internal tool for a large class library
  562. - called the BSA library - which covers all OS/2 programming tasks (lots of GUI classes,
  563. process / thread / file / pipe handling, database access, generic containers etc.). This library
  564. now consists of about 300 classes that have been built by 4 programmers in 2.5 years. All
  565. work on these classes has been and will be done with the Browser. Currently there are about 10
  566. programmers in 3 different companies working with the Browser. A list of reference customers is
  567. available from BISS.
  568.  
  569. The Browser also has been and currently is used for its own development.
  570.  
  571.  
  572.  
  573. 6. Availability
  574.  
  575.  
  576. 6.1 General Availability
  577.  
  578. The official product release if scheduled for June 1994. There will be an introductory price of $ 295.
  579. The regular price for the basic version will be $ 495. Site licenses as well as volume discounts will
  580. be available. There will be versions with additional tools (e.g. graphical class editor) as well as
  581. versions with class libraries. Versions for the Borland and Watcom compilers are scheduled for
  582. the second half of the year.
  583.  
  584.  
  585. 6.2 Beta Testing
  586.  
  587. Currently there are plans for another beta test cycle starting in April. Beta testers should have
  588. solid C++ skills. To prevent communication delays, the number of additional test sites has to be
  589. restricted ( < 15 ). If you are interested in attending the beta test program, please send a short
  590. profile of your company, a brief description of what you are doing with C++ and the number of
  591. programmers that would be involved in the testing. There are no costs for the test program.
  592. Compuserve will be used for communication purposes.
  593.  
  594. The main problem for current beta testers is certainly the lack of English documentation. This
  595. will be solved (together with online help) by end of April.
  596.  
  597.  
  598. 6.3 How to get in Contact with BISS
  599.  
  600. BISS GmbH
  601. Chaukenweg 12
  602. 26388 Wilhelmshaven
  603. Germany
  604.  
  605. phone:             49 4423 1235     (office, time difference to Eastern time: +6 h)
  606. FAX:                49 4423 2360
  607. Compuserve:   100031,1733      (best way to get in touch with the browser people)
  608.  
  609.  
  610.  
  611.